【问题标题】:javax.net.ssl.SSLHandshakeException on Android 4.3Android 4.3 上的 javax.net.ssl.SSLHandshakeException
【发布时间】:2019-08-26 02:54:22
【问题描述】:

不幸的是,我一直坚持让我的应用程序能够在 Android 版本

 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] 你们对这个问题有什么想法吗?

【问题讨论】:

    标签: android ssl okhttp tls1.2 okhttp3


    【解决方案1】:

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

    详情请见OkHttp’s HTTPS page

    【讨论】:

    • 感谢您的回复!不幸的是,响应仍然相同。
    猜你喜欢
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-22
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    相关资源
    最近更新 更多