2016-08-12 3 views
0

Smack 4.1.8 라이브러리를 사용하여 XMPP를 통해 Android (23)에서 채팅 응용 프로그램을 빌드하려고합니다. 나는 휴대 전화 (갤럭시 S6 및 갤럭시 E7)에서 직접 테스트하고 있습니다. xmpp.jp에 연결하려고합니다. 연결할 때이 예외가 발생합니다.Android (23) - Smack (4.1.8) - XMPP - "SSL23_GET_SERVER_HELLO : 알 수없는 프로토콜"오류

08-13 00:49:49.017 15912-16034/com.example.android.proximitychat W/System.err: javax.net.ssl.SSLHandshakeException: Handshake failed 
08-13 00:49:49.017 15912-16034/com.example.android.proximitychat W/System.err:  at com.google.android.gms.org.conscrypt.OpenSSLSocketImpl.startHandshake(:com.google.android.gms:405) 
08-13 00:49:49.017 15912-16034/com.example.android.proximitychat W/System.err:  at com.google.android.gms.org.conscrypt.OpenSSLSocketImpl.waitForHandshake(:com.google.android.gms:638) 
08-13 00:49:49.017 15912-16034/com.example.android.proximitychat W/System.err:  at com.google.android.gms.org.conscrypt.OpenSSLSocketImpl.getInputStream(:com.google.android.gms:600) 
08-13 00:49:49.017 15912-16034/com.example.android.proximitychat W/System.err:  at org.jivesoftware.smack.tcp.XMPPTCPConnection.initReaderAndWriter(XMPPTCPConnection.java:659) 
08-13 00:49:49.017 15912-16034/com.example.android.proximitychat W/System.err:  at org.jivesoftware.smack.tcp.XMPPTCPConnection.initConnection(XMPPTCPConnection.java:629) 
08-13 00:49:49.017 15912-16034/com.example.android.proximitychat W/System.err:  at org.jivesoftware.smack.tcp.XMPPTCPConnection.connectInternal(XMPPTCPConnection.java:855) 
08-13 00:49:49.017 15912-16034/com.example.android.proximitychat W/System.err:  at org.jivesoftware.smack.AbstractXMPPConnection.connect(AbstractXMPPConnection.java:364) 
08-13 00:49:49.017 15912-16034/com.example.android.proximitychat W/System.err:  at com.example.android.proximitychat.Utility.MyXMPP$2.doInBackground(MyXMPP.java:247) 
08-13 00:49:49.017 15912-16034/com.example.android.proximitychat W/System.err:  at com.example.android.proximitychat.Utility.MyXMPP$2.doInBackground(MyXMPP.java:227) 
08-13 00:49:49.017 15912-16034/com.example.android.proximitychat W/System.err:  at android.os.AsyncTask$2.call(AsyncTask.java:292) 
08-13 00:49:49.017 15912-16034/com.example.android.proximitychat W/System.err:  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
08-13 00:49:49.017 15912-16034/com.example.android.proximitychat W/System.err:  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
08-13 00:49:49.017 15912-16034/com.example.android.proximitychat W/System.err:  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
08-13 00:49:49.017 15912-16034/com.example.android.proximitychat W/System.err:  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
08-13 00:49:49.017 15912-16034/com.example.android.proximitychat W/System.err:  at java.lang.Thread.run(Thread.java:818) 
08-13 00:49:49.017 15912-16034/com.example.android.proximitychat W/System.err: Caused by: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0xb88c5e50: Failure in SSL library, usually a protocol error 
08-13 00:49:49.017 15912-16034/com.example.android.proximitychat W/System.err: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol (third_party/java/android_libs/gcore/migration_libs/packages/external/openssl/ssl/s23_clnt.c:795 0x9c5f2dcc:0x00000000) 
08-13 00:49:49.017 15912-16034/com.example.android.proximitychat W/System.err:  at com.google.android.gms.org.conscrypt.NativeCrypto.SSL_do_handshake(Native Method) 
08-13 00:49:49.017 15912-16034/com.example.android.proximitychat W/System.err:  at com.google.android.gms.org.conscrypt.OpenSSLSocketImpl.startHandshake(:com.google.android.gms:333) 

사용하는 경우 tutorial입니다. DummySSLSocketFactory, [NoSSLFactory] 및 [TLSFactory] 솔루션을 시도했습니다 (2 개 이상의 링크를 게시 할 수 없습니다 : |). 그들 중 누구도 나를 위해 일하지 못했습니다.

내 연결 코드는 다음과 같습니다

private void initialiseConnection() { 

    XMPPTCPConnectionConfiguration.Builder config = XMPPTCPConnectionConfiguration 
      .builder(); 
    //config.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled); 
    config.setSecurityMode(ConnectionConfiguration.SecurityMode.required); 
    config.setServiceName(serverAddress); 
    config.setHost(serverAddress); 
    //config.setPort(5222); 
    config.setPort(5222); 
    config.setDebuggerEnabled(true); 

    SSLContext sslContext = null; 
    try { 
     sslContext = createSSLContext(context); 
     //sslContext.getSupportedSSLParameters(); 

    } catch (KeyStoreException e) { 
     e.printStackTrace(); 
    } catch (KeyManagementException e){ 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (CertificateException e) { 
     e.printStackTrace(); 
    } catch (NoSuchAlgorithmException e) { 
     e.printStackTrace(); 

    //} catch(NoSuchProviderException e){ 
    // e.printStackTrace(); 
    } 

    //config.setSocketFactory(new DummySSLSocketFactory()); 
    //config.setSocketFactory(SSLSocketFactory.getDefault()); 
    config.setCustomSSLContext(sslContext); 
    //SSLSocketFactory socketFactory = sslContext.getSocketFactory(); 
    //NoSSLv3SocketFactory socketFactory = new NoSSLv3SocketFactory(sslContext.getSocketFactory()); 
    TLSSocketFactory socketFactory = new TLSSocketFactory(sslContext); 
    //SSLSocketFactory noSSLv3Factory = new TlsOnlySocketFactory(sslContext.getSocketFactory()); 

    config.setSocketFactory(socketFactory); 
    config.setEnabledSSLProtocols(new String[]{"TLSv1", "TLSv1.1", "TLSv1.2"}); 


    XMPPTCPConnection.setUseStreamManagementResumptiodDefault(true); 
    XMPPTCPConnection.setUseStreamManagementDefault(true); 
    connection = new XMPPTCPConnection(config.build()); 

    XMPPConnectionListener connectionListener = new XMPPConnectionListener(); 
    connection.addConnectionListener(connectionListener); 
} 

private SSLContext createSSLContext(Context context) throws KeyStoreException, 
     NoSuchAlgorithmException, KeyManagementException, IOException, CertificateException { 

    KeyStore trustStore; 
    InputStream in = null; 
    trustStore = KeyStore.getInstance("BKS"); 

    in = context.getResources().openRawResource(R.raw.keystore1); 

    trustStore.load(in, "MY_STORE_PASSWORD".toCharArray()); 

    TrustManagerFactory trustManagerFactory = TrustManagerFactory 
      .getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
    trustManagerFactory.init(trustStore); 
    //SSLContext sslContext = SSLContext.getInstance("TLS"); 
    SSLContext sslContext = null; 
    try { 
     //sslContext = SSLContext.getInstance("TLSv1", "AndroidOpenSSL"); 
     sslContext = SSLContext.getInstance("TLS"); 
    } 
    catch(Exception e){ 
     e.printStackTrace(); 
    } 

    sslContext.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom()); 


    Log.d("SSL Protocol: ", sslContext.getProtocol()); 
    Log.d("SSL Provider: ", sslContext.getProvider().toString()); 
    String[] protocols = sslContext.getDefaultSSLParameters().getProtocols(); 
    sslContext.getDefaultSSLParameters().setProtocols(protocols); 

    return sslContext; 
} 

TLSFactory 코드는 다음과 같습니다

나는 이것에 대한 찾을 수있는 모든 솔루션을 시도
public class TLSSocketFactory extends SSLSocketFactory { 

    private SSLSocketFactory internalSSLSocketFactory; 

    public TLSSocketFactory() throws KeyManagementException, NoSuchAlgorithmException { 
     SSLContext context = SSLContext.getInstance("TLS"); 
     context.init(null, null, null); 
     internalSSLSocketFactory = context.getSocketFactory(); 
    } 

    public TLSSocketFactory(SSLContext sslContext){ 
     internalSSLSocketFactory = sslContext.getSocketFactory(); 
    } 

    @Override 
    public String[] getDefaultCipherSuites() { 
     return internalSSLSocketFactory.getDefaultCipherSuites(); 
    } 

    @Override 
    public String[] getSupportedCipherSuites() { 
     return internalSSLSocketFactory.getSupportedCipherSuites(); 
    } 

    @Override 
    public Socket createSocket() throws IOException { 
     return enableTLSOnSocket(internalSSLSocketFactory.createSocket()); 
    } 

    @Override 
    public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException { 
     return enableTLSOnSocket(internalSSLSocketFactory.createSocket(s, host, port, autoClose)); 
    } 

    @Override 
    public Socket createSocket(String host, int port) throws IOException, UnknownHostException { 
     return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port)); 
    } 

    @Override 
    public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException, UnknownHostException { 
     return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port, localHost, localPort)); 
    } 

    @Override 
    public Socket createSocket(InetAddress host, int port) throws IOException { 
     return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port)); 
    } 

    @Override 
    public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException { 
     return enableTLSOnSocket(internalSSLSocketFactory.createSocket(address, port, localAddress, localPort)); 
    } 

    private Socket enableTLSOnSocket(Socket socket) { 
     if(socket != null && (socket instanceof SSLSocket)) { 
      //((SSLSocket)socket).setEnabledProtocols(new String[] {"SSLv3","TLSv1", "TLSv1.1", "TLSv1.2"}); 
      ((SSLSocket)socket).setEnabledProtocols(new String[] {"TLSv1", "TLSv1.1", "TLSv1.2"}); 
      Log.d("TLSSocketFactory: ", "setting TLS list"); 
     } 
     if(socket!= null) { 
      Log.d("TLSSocketFactory: ", "socket class: " +socket.getClass()); 
     } 
     Log.d("TLSSocketFactory: ","Returning TLS Enabled Socket"); 

     return socket; 
    } 
} 

는 여전히 XMPP 서버에 연결할 수 없습니다입니다. 나는 또한 비슷한 결과와 함께 wtfismyip.com에서 jabber 서버를 시도했다. 이 시점에서 2 주 이상 붙어 있습니다. 이 장애물을 지나치는 데 도움을 주셔서 감사합니다.

답변

0

답변을 늦 췄지만 여전히 .. 5222 포트를 사용하고 있기 때문에 문제가되는 것 같습니다. 서버 설정을 확인하면 5223을 서버에 설정된 클라이언트 SSL 포트로 사용할 수 있습니다. 그렇다면이 문제를 해결할 것입니다.