对于相同的请求,由于发生SSLHandshakeException,导致客户端应用程序中的TLS版本时间更改

问题描述

我的客户端应用程序在具有Java 1.7.0_79版本的tomcat服务器上运行。它将从某些第三方服务器应用程序获取数据。但是由于以下异常,时间服务器连接失败。

javax.net.ssl.SSLHandshakeException:远程主机关闭连接 在握手时 sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:953)位于 sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1332)

大多数服务器应用程序都支持TLSv1.2,由于我的客户端应用程序代码是这样的。经过分析,数据包确定TLSv1.1会从客户端发送失败的连接。是否可以通过以下代码获得除TLSv1.2以外的其他TLS版本?同样,此代码由客户端应用程序中的多个线程执行。请指教。

TrustManager[] trustAllCerts = new TrustManager[]{
     new x509trustmanager() {
          ...
}};

SSLContext sc = SSLContext.getInstance("TLSv1.2");
sc.init(null,trustAllCerts,new java.security.SecureRandom());
SSLContext.setDefault(sc);
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

URL mUrl = new URL(url);
URLConnection ucon = mUrl.openConnection();
HttpURLConnection con = (HttpURLConnection) ucon;
...
responseBody = con.getInputStream();

解决方法

使用 -Djavax.net.debug=ssl:all 获取详细的 SSL 连接日志。这将有助于获得有关错误的更多详细信息。