【问题标题】:Android HTTPS SSLHandshake Exception : Connection Reset By Peer, using ksoap on Lollipop Android DeviceAndroid HTTPS SSLHandshake 异常:连接由 Peer 重置,在 Lollipop Android 设备上使用 ksoap
【发布时间】:2015-06-19 22:28:33
【问题描述】:

我在使用 Lollipop Android 设备使用 ksoap 库连接到 https 站点时遇到问题。我收到 SSLHandshake 异常:对等连接重置。我注意到 Android 5.0 对 TLS/SSL 配置进行了更改,在他们的网站上声明

TLSv1.2 和 TLSv1.1 协议现已启用, AES-GCM (AEAD) 密码套件现已启用, MD5、3DES、导出和静态密钥 ECDH 密码套件现已禁用, 首选前向保密密码套件(ECDHE 和 DHE)。

我检查了服务器,它使用 TLS_RSA_WITH_3DES_EDE_CBC_SHA 作为密码套件,Android 5.0 不支持

我已尝试在此链接上使用解决方案来接受所有证书: KSOAP 2 Android with HTTPS

并制作自定义 SSLSocketFactory 以启用首选密码套件: How to override the cipherlist sent to the server by Android when using HttpsURLConnection?

但没有成功,我收到一个错误“不支持 TLS_RSA_WITH_3DES_EDE_CBC_SHA”

是否有任何解决方法可以在客户端处理此问题,因为我知道这可以通过升级服务器以添加 Android 5 支持的现代密码套件来解决。

【问题讨论】:

    标签: android ssl android-5.0-lollipop android-ksoap2 sslhandshakeexception


    【解决方案1】:

    我遇到了同样的问题。我找到了一个链接https://code.google.com/p/android/issues/detail?id=88313,在那里我找到了一个代码:

    public class MySSLSocketFactory extends SSLSocketFactory {
               SSLContext sslContext = SSLContext.getInstance("TLS");
    
    
               public MySSLSocketFactory() throws UnrecoverableKeyException, NoSuchAlgorithmException, KeyStoreException, KeyManagementException {
                    super(null, null, null, null, null, null);
    
                    final TrustManagerFactory trustMgrFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
                    trustMgrFactory.init((KeyStore) null);
    
                    sslContext.init(null, trustMgrFactory.getTrustManagers(), new SecureRandom());
                }
    
                @Override
                public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException {
                    final SSLSocket sslSocket = (SSLSocket) sslContext.getSocketFactory().createSocket(socket, host, port, autoClose);
                    sslSocket.setEnabledCipherSuites(sslSocket.getSupportedCipherSuites());
                    return sslSocket;
                }
    
                @Override
                public Socket createSocket() throws IOException {
                    final SSLSocket sslSocket = (SSLSocket) sslContext.getSocketFactory().createSocket();
                    sslSocket.setEnabledCipherSuites(sslSocket.getSupportedCipherSuites());
                    return sslSocket;
                }
        }
    

    您可以尝试使用自定义SSlSocketFactory,正如我在上面所写的。这也不是最好的解决方案。稍后您可能会遇到一些安全问题,因为它可以使用一些旧密码算法进行连接。

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      我有同样的问题,我写的是 SSL_RSA_WITH_3DES_EDE_CBC_SHA 而不是 TLS_RSA_WITH_3DES_EDE_CBC_SHA 它对我有用。

      你可以查看这个Is TLS_RSA_WITH_3DES_EDE_CBC_SHA equivalent to SSL_RSA_WITH_3DES_EDE_CBC_SHA

      【讨论】:

        猜你喜欢
        • 2012-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-15
        • 2018-03-30
        • 2012-06-02
        • 2011-05-31
        相关资源
        最近更新 更多