java - Android < 5.0 (Lollipop) 中存在 TLSv1.2 问题的套接字握手

标签 java android sockets ssl tls1.2

我使用以下代码创建到服务器的套接字并获取服务器公钥(服务器 TLS 版本为 1.2)。
问题出在 Android < 5.0 的 socket.startHandshake();

catch error : javax.net.ssl.SSLException: Connection closed by peer.

我搜索了很多,发现我必须强制 Android < 5 使用 TLSv1.2,但我不能这样做(+++)。

SSLSocketFactory factory = HttpsURLConnection.getDefaultSSLSocketFactory();
SSLSocket socket = (SSLSocket) factory.createSocket(hostname, 443);
socket.setSoTimeout(10000);
socket.startHandshake();
Certificate[] certs = socket.getSession().getPeerCertificates();
Certificate cert = certs[0];
PublicKey serverKey = cert.getPublicKey();

CertificateFactory cf      = CertificateFactory.getInstance("X.509");
InputStream        caInput = context.getResources().getAssets().open("filename.cert");
Certificate        ca;
ca = cf.generateCertificate(caInput);

if (String.valueOf(serverKey).equals(String.valueOf(ca.getPublicKey()))) {
     My codes ...
}

我该怎么做?谢谢。

最佳答案

您应该像这样在 Android KitKat 及以下版本上强制使用 TLSv1.2:

if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) {
    socket.setEnabledProtocols(new String[]{"TLSv1.2"});
}

https://developer.android.com/reference/javax/net/ssl/SSLSocket.html

干杯!

关于java - Android < 5.0 (Lollipop) 中存在 TLSv1.2 问题的套接字握手,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59442370/

相关文章:

android - 我可以对 Koin 模块进行单元测试吗?

java - 调试异步任务时 Android Studio 中的奇怪调试器行为

Android 以编程方式安装 .apk 文件

java - Volley 补丁错误

clojure - 在clojure中编写一个多路复用服务器?

c - 使用 Windows 套接字的 WriteFile 返回无效参数错误

java - 代码在我们没有要求的情况下运行多次

java - 从Java执行Pig脚本时出错

java - sudo R CMD javareconf 报错

linux - 是否有原始套接字的安全接口(interface)?