它显示为
java.net.SocketTimeoutException,起初建议提高客户端的连接超时值,正如在此答案中所解释的-
但在查看…的当前源代码时,
okhttp3.internal.platform.AndroidPlatform这提示不兼容的协议。
服务器的SSL证书支持
TLS1.0,这对于Android 4.x来说是必需的(它们没有问题);问题在于,当前版本的
OkHttp3不再支持
TLS1.0,因此握手将永远不会发生(这就是为什么它会引发误导
SocketTimeoutException而不是
SSLHandshakeException)的原因。
使用时
OkHttp3
3.12.x,默认配置仍应支持它
MODERN_TLS-
但是可以指示
OkHttp3
3.13.x使用配置
COMPATIBLE_TLS代替:
List tlsSpecs = Arrays.asList(ConnectionSpec.MODERN_TLS);if(Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { tlsSpecs = Arrays.asList(ConnectionSpec.COMPATIBLE_TLS);}OkHttpClient client = new OkHttpClient.Builder() .connectionSpecs(tlsSpecs) .build();还必须将其设置为以下客户端
Retrofit:
Retrofit retrofit = new Retrofit.Builder() .baseUrl(Api.base_URL) .addConverterFactory(GsonConverterFactory.create()) .setClient(client) .build();
有关每个版本的可用协议支持,请参阅TLS配置历史记录
OkHttp3。看起来,
3.12.x甚至已经支持了
TLS1.3,因为将来Android需要它
Q。它甚至可能不会被要求下级
OkHttp3,因为
MODERN_TLS中
3.12.x仍然支持
TLSv1,而在
3.13.x它已提前转移到
COMPATIBLE_TLS;
仍然不确定
3.14.x。
即使使用最新版本的
OkHttp3,也可能仍可以将所需的
TLS1.0协议重新添加到中
ConnectionSpec.COMPATIBLE_TLS,因为这是一种
ArrayList方法
.add()-不做任何保证,不会再有不兼容的情况。
3.12.x可能仍然是支持Android4.x及更高版本的最佳选择,甚至可能会有一些新功能的后继端口。



