Java Android中的套接字握手<;TLSv1.2问题的5.0(棒棒糖)

Java Android中的套接字握手<;TLSv1.2问题的5.0(棒棒糖),java,android,sockets,ssl,tls1.2,Java,Android,Sockets,Ssl,Tls1.2,我使用下面的代码创建服务器套接字并获取服务器公钥(服务器TLS版本为1.2)。 问题出在Android

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

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


我该怎么做?谢谢。

您应该在Android KitKat及以下版本上强制使用TLSv1.2,如下所示:

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

if(Build.VERSION.SDK_INT最后,我必须将服务器SSL降级为TLSv1并修复问题。

我这样做了,但发生了错误:
javax.net.SSL.SSLException:Connection closed by peer 12-22 11:54:26.970 3741-3762/ir.refahotp.refahotp W/System.err:at com.android.org.concrypt.NativeCrypto.SSL\u握手(本机方法)12-22 11:54:26.970 3741-3762/ir.refahotp.refahotp W/System.err:在com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:405)
您在哪个android版本上运行它?请注意,android 4.1+(JellyBean)支持v1.2仅限。服务器上的一切正常。我使用Android 4.4是否可以确认问题不是由以下任何原因引起的:1.颁发服务器证书的CA未知2.服务器证书未经CA签名,而是自签名3.服务器配置缺少中间CA
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 ...
}
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) {
    socket.setEnabledProtocols(new String[]{"TLSv1.2"});
}