简体   繁体   English

Android(23)-Smack(4.1.8)-XMPP-“ SSL23_GET_SERVER_HELLO:未知协议”错误

[英]Android (23) - Smack (4.1.8) - XMPP - “SSL23_GET_SERVER_HELLO:unknown protocol” error

I am trying to build a chat application in Android (23), over XMPP, using Smack 4.1.8 libraries. 我正在尝试使用Smack 4.1.8库通过XMPP在Android(23)中构建聊天应用程序。 I'm testing this directly on mobile phones (Galaxy S6 and Galaxy E7). 我正在直接在手机(Galaxy S6和Galaxy E7)上对此进行测试。 I am trying to connect to xmpp.jp. 我正在尝试连接到xmpp.jp。 I am getting this exception when trying to connect: 尝试连接时出现此异常:

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)

Using this tutorial . 使用本教程 I have tried the DummySSLSocketFactory , [NoSSLFactory] and [TLSFactory] solutions (Unable to post more than 2 links :|). 我尝试了DummySSLSocketFactory ,[NoSSLFactory]和[TLSFactory]解决方案(无法发布两个以上的链接:|)。 None of them has worked for me. 他们都没有为我工作。

My connection code is: 我的连接代码是:

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;
}

The TLSFactory code is: 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;
    }
}

I have tried every solution I could find for this and am still unable to connect to the xmpp server. 我已经尝试了所有可以找到的解决方案,但仍然无法连接到xmpp服务器。 I have also tried the jabber server at wtfismyip.com with similar results. 我也尝试过在wtfismyip.com上使用jabber服务器,结果相似。 Stuck at this point for over 2 weeks now. 现在停留在此超过2周。 Would appreciate help in getting past this roadblock. 希望能帮助您克服这一障碍。

Rather late to answer, but still.. I guess the issue is because you are using 5222 as the port. 回答的时间还不算晚,但是仍然..我想问题是因为您使用5222作为端口。 If you check your server settings, you might find 5223 as the Client SSL Port set in your server. 如果检查服务器设置,则可能会在服务器中找到5223作为客户端SSL端口设置。 If so, just changing that will fix this issue. 如果是这样,只需进行更改即可解决此问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Android 5.1.1 SSL例程:SSL23_GET_SERVER_HELLO:sslv3警报握手失败 - Android 5.1.1 SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure ssl23_get_server_hello:tlsv1 警报握手失败 android 4.4 - ssl23_get_server_hello:tlsv1 alert handshake failure android 4.4 SSL 库中的 Firebase Firestore 后端故障,通常是协议错误 error:140740B5:SSL routines:SSL23_CLIENT_HELLO:no ciphers - Firebase Firestore Backend Failure in SSL library, usually a protocol error error:140740B5:SSL routines:SSL23_CLIENT_HELLO:no ciphers Android Smack SSL / TLS连接到具有CA证书的XMPP Ejabberd服务器 - Android Smack SSL/TLS connection to XMPP Ejabberd server with CA Certificate 如何使用Android上的Smack让Openfire XMPP服务器上的所有用户? - How to get all user on openfire xmpp server using smack on android? 如何在XMPP SMACK库中获取服务器时间 - How to get server time in XMPP SMACK library Android API 23 startActivity错误 - android api 23 startActivity error Android 23 API IllegalArgumentException错误 - Android 23 API IllegalArgumentException error 使用smack的Android XMPP:没有来自服务器的响应 - Android XMPP using smack: No response from server 科尔多瓦Android 6.2.1 + Crosswalk 23 => SSL错误:net :: ERR_INSECURE_RESPONSE - Cordova Android 6.2.1 + Crosswalk 23 => SSL error: net::ERR_INSECURE_RESPONSE
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM