最近在应用OkHttp进行网络请求时,由于服务器添加了对https的支持,所以客户端也做了相应的改变,结果,没想到的是,麻烦出现了:
01-17 15:58:16.445 29679-29824/****** I/NetworkManagementSocketTagger: untagSocket(88)
01-17 15:58:16.450 29679-29679/****** W/System.err: javax.net.ssl.SSLHandshakeException: Handshake failed
01-17 15:58:16.525 29679-29679/****** W/System.err: at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:390)
01-17 15:58:16.525 29679-29679/****** W/System.err: at okhttp3.internal.connection.RealConnection.connectTls(RealConnection.kt:350)
01-17 15:58:16.525 29679-29679/****** W/System.err: at okhttp3.internal.connection.RealConnection.establishProtocol(RealConnection.kt:308)
01-17 15:58:16.525 29679-29679/****** W/System.err: at okhttp3.internal.connection.RealConnection.connect(RealConnection.kt:182)
01-17 15:58:16.525 29679-29679/****** W/System.err: at okhttp3.internal.connection.ExchangeFinder.findConnection(ExchangeFinder.kt:238)
01-17 15:58:16.525 29679-29679/****** W/System.err: at okhttp3.internal.connection.ExchangeFinder.findHealthyConnection(ExchangeFinder.kt:111)
01-17 15:58:16.525 29679-29679/****** W/System.err: at okhttp3.internal.connection.ExchangeFinder.find(ExchangeFinder.kt:79)
01-17 15:58:16.525 29679-29679/****** W/System.err: at okhttp3.internal.connection.Transmitter.newExchange$okhttp(Transmitter.kt:163)
01-17 15:58:16.525 29679-29679/****** W/System.err: at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.kt:35)
01-17 15:58:16.525 29679-29679/****** W/System.err: at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:112)
01-17 15:58:16.525 29679-29679/****** W/System.err: at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:87)
01-17 15:58:16.525 29679-29679/****** W/System.err: at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.kt:82)
01-17 15:58:16.525 29679-29679/****** W/System.err: at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:112)
01-17 15:58:16.525 29679-29679/****** W/System.err: at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:87)
01-17 15:58:16.525 29679-29679/****** W/System.err: at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.kt:84)
01-17 15:58:16.525 29679-29679/****** W/System.err: at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:112)
01-17 15:58:16.525 29679-29679/****** W/System.err: at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.kt:71)
01-17 15:58:16.525 29679-29679/****** W/System.err: at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:112)
01-17 15:58:16.525 29679-29679/****** W/System.err: at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:87)
01-17 15:58:16.525 29679-29679/****** W/System.err: at com.base.network.LoggerInterceptor.intercept(LoggerInterceptor.java:42)
01-17 15:58:16.525 29679-29679/****** W/System.err: at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:112)
01-17 15:58:16.525 29679-29679/****** W/System.err: at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:87)
01-17 15:58:16.525 29679-29679/****** W/System.err: at com.base.network.HeaderInterceptor.intercept(HeaderInterceptor.java:44)
01-17 15:58:16.525 29679-29679/****** W/System.err: at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:112)
01-17 15:58:16.525 29679-29679/****** W/System.err: at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:87)
01-17 15:58:16.525 29679-29679/****** W/System.err: at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.kt:194)
01-17 15:58:16.525 29679-29679/****** W/System.err: at okhttp3.RealCall$AsyncCall.run(RealCall.kt:138)
01-17 15:58:16.525 29679-29679/****** W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
01-17 15:58:16.525 29679-29679/****** W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
01-17 15:58:16.525 29679-29679/****** W/System.err: at java.lang.Thread.run(Thread.java:818)
01-17 15:58:16.525 29679-29679/****** W/System.err: Caused by: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0xb4ba4800: Failure in SSL library, usually a protocol error
01-17 15:58:16.525 29679-29679/****** W/System.err: error:14077102:SSL routines:SSL23_GET_SERVER_HELLO:unsupported protocol (external/openssl/ssl/s23_clnt.c:740 0xa9794f89:0x00000000)
01-17 15:58:16.525 29679-29679/****** W/System.err: at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(Native Method)
01-17 15:58:16.525 29679-29679/****** W/System.err: at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:318)
01-17 15:58:16.525 29679-29679/****** W/System.err: ... 29 more
我在网上搜了很多资料,尝试了网上说的很多方法,有的说是Android5.0以下报这个错误,可是我拿Android9.0的华为手机测试,结果依然都是报这个错误。
继续在网上找呀找,找呀找,终于找到了一个靠谱的解决方法,在此深深的对网友(俗人浮生)表示感谢。
解决方法如下(上码):
// Https 异常:javax.net.ssl.SSLHandshakeException: Handshake failed
// Caused by: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x7a59e45208: Failure in SSL library, usually a protocol error
// 解决在Android5.0版本以下https无法访问(亲测5.0以上版本也报同样的错误,猜测应该通过服务器配置协议兼容可以解决,目前是Android端自己做了兼容)
ConnectionSpec spec = new ConnectionSpec.Builder(ConnectionSpec.COMPATIBLE_TLS)
.tlsVersions(TlsVersion.TLS_1_2, TlsVersion.TLS_1_1, TlsVersion.TLS_1_0)
.allEnabledCipherSuites()
.build();
// 兼容http接口
ConnectionSpec spec1 = new ConnectionSpec.Builder(ConnectionSpec.CLEARTEXT).build();
okHttpClientBuilder.connectionSpecs(Arrays.asList(spec, spec1));
最后附上参考网友俗人浮生的文章地址:
https://www.jianshu.com/p/64499bdf6842
希望对遇到此类问题的网友们有所帮助。