javax.net.ssl.SSLException:连接由 4.4.2 设备上的对等方关闭(适用于 6.0.1)

Posted

技术标签:

【中文标题】javax.net.ssl.SSLException:连接由 4.4.2 设备上的对等方关闭(适用于 6.0.1)【英文标题】:javax.net.ssl.SSLException: Connection closed by peer on 4.4.2 device (works on 6.0.1) 【发布时间】:2016-08-21 16:39:13 【问题描述】:

当我在我的应用程序中执行网络调用时遇到此错误的问题。主要问题是相同的代码适用于 android 6.0.1 设备,但在 4.4.2 设备上,我收到此错误:

javax.net.ssl.SSLException: Connection closed by peer 
at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(Native Method)
at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:406)
at okhttp3.internal.io.RealConnection.connectTls(RealConnection.java:188)
at okhttp3.internal.io.RealConnection.connectSocket(RealConnection.java:145)
at okhttp3.internal.io.RealConnection.connect(RealConnection.java:108)
at okhttp3.internal.http.StreamAllocation.findConnection(StreamAllocation.java:188)
at okhttp3.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:127)
at okhttp3.internal.http.StreamAllocation.newStream(StreamAllocation.java:97)
at okhttp3.internal.http.HttpEngine.connect(HttpEngine.java:289)
at okhttp3.internal.http.HttpEngine.sendRequest(HttpEngine.java:241)
at okhttp3.RealCall.getResponse(RealCall.java:240)
at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:198)
at okhttp3.logging.HttpLoggingInterceptor.intercept(HttpLoggingInterceptor.java:203)
at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:187)
at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:160)
at okhttp3.RealCall.access$100(RealCall.java:30)
at okhttp3.RealCall$AsyncCall.execute(RealCall.java:127)
at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:33)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)

我无法从服务器请求数据。

如果您需要更多数据,请随时询问。谢谢。

【问题讨论】:

看看罗伯特提供的here的答案 谢谢,这引导我找到解决方案! 【参考方案1】:

此处的关键是强制使用 TLS 1.2 协议,基于此处的this 链接。

我唯一需要在这里纠正的是直接强制使用 TLS 1.2 协议,如下所示:

private class NoSSLv3SSLSocket extends DelegateSSLSocket 

    private NoSSLv3SSLSocket(SSLSocket delegate) 
        super(delegate);
    

    @Override
    public void setEnabledProtocols(String[] protocols) 
        super.setEnabledProtocols(new String[]"TLSv1.2"); // force to use only TLSv1.2 here
    

【讨论】:

@DavidCheung 随意发布您自己的答案。 @robigroza 我可以知道,我必须在哪里使用此代码。请提前致谢。 @robigroza 它不起作用,出现 SSL 握手异常失败错误。

以上是关于javax.net.ssl.SSLException:连接由 4.4.2 设备上的对等方关闭(适用于 6.0.1)的主要内容,如果未能解决你的问题,请参考以下文章