生也有涯,知也无涯。这篇文章主要讲述Android 4.3上的javax.net.ssl.SSLHandshakeException相关的知识,希望能为你提供帮助。
不幸的是,我一直坚持让我的应用程序能够在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();
【Android 4.3上的javax.net.ssl.SSLHandshakeException】在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]你们对这个问题有任何想法吗?答案用
MODERN_TLS
替换COMPATIBLE_TLS
。这对于启用过时的TLS版本是必要的。有关详细信息,请参阅OkHttp’s HTTPS page。
推荐阅读
- 带有标签的Flutter SliverAppBar覆盖内容
- 我在哪里可以购买.app TLD( [关闭])
- Android - 以太网 - 以编程方式
- Create-React-App公用文件夹子文件夹
- 将create-react-app集成到电子中
- Google App Scripts(表格)未连接YouTube品牌帐户
- Android YouTube Player API Fragment无法手动处理触摸事件
- 如何在Android中嵌入和播放YouTube视频
- 如何在没有YoutubeBaseActivity的情况下集成Youtube视频集成Android的