Android 4.3上的javax.net.ssl.SSLHandshakeException

时间:2019-04-04 11:08:52

标签: android ssl okhttp tls1.2 okhttp3

不幸的是,我一直坚持让我的应用程序能够在Android版本<5.0上使用TLS 1.2协议。 我使用okhttp3库来创建和触发适当的请求。一切都可以在运行Lollipop +的设备上完美运行。 我正在建立这样的OkHttpClient实例:

 SSLContext context = SSLContext.getInstance("TLS"); // tried TLSv1.2
    context.init(null, trustManagers, null);

    List<ConnectionSpec> specs = new ArrayList<>();
    specs.add(ConnectionSpec.MODERN_TLS);
    specs.add(ConnectionSpec.CLEARTEXT);

    OkHttpClient client = new OkHttpClient.Builder()
                                  .sslSocketFactory(new TlsSocketFactory(context.getSocketFactory()), (X509TrustManager)trustManagers[0])
                                  .connectionSpecs(specs)
                                  .build();

在TlsSocketFactory类中,我正在设置启用的协议:

  private Socket enableTLSOnSocket(Socket socket) {
    if(socket != null && (socket instanceof SSLSocket)) {
        ((SSLSocket)socket).setEnabledProtocols(new String[] {"TLSv1.1", "TLSv1.2"});
    }
    return socket;
}

执行请求后,我遇到了这个问题:

javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x67531570: Failure in SSL library, usually a protocol error
error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure (external/openssl/ssl/s23_clnt.c:744 0x5dfc97e8:0x00000000)

我已经对这种问题进行了很多研究,但是不幸的是,没有提出的解决方案能够解决问题。我已经尝试过:

  • 安装适当的安全提供程序link
  • 创建TLSSocketFactory类(此处类似:link
  • 创建NoSSLv3SocketFactory类(在此处显示为解决方案:link
  • 检查服务器是否使用正确的密码(确实如此)

奇怪的是,调用getSupportedSSLParameters().getProtocols()返回[SSLv3,TLSv1,TLSv1.1,TLSv1.2],但是调用getDefaultSSLParameters().getProtocols()仅返回[SSLv3,TLSv1] 你们对这个问题有任何想法吗?

1 个答案:

答案 0 :(得分:2)

MODERN_TLS替换为COMPATIBLE_TLS。这是启用过时的TLS版本所必需的。

有关详细信息,请参见OkHttp’s HTTPS page