0

我在使用 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?

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

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

4

2 回答 2

0

我有同样的问题。我找到了一个链接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我上面写的自定义。这也不是最好的解决方案。稍后您可能会遇到一些安全问题,因为连接它可以使用一些旧的密码算法。

希望这可以帮助。

于 2015-06-22T10:59:04.147 回答
0

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

您可以检查这是否 TLS_RSA_WITH_3DES_EDE_CBC_SHA 等效于 SSL_RSA_WITH_3DES_EDE_CBC_SHA

于 2015-07-20T14:27:24.260 回答