环境:
? ? ? ? JDK1.7
? ? ? ? RestTemplate
使用RestTemplate请求第三方接口时,抛出错误
java.net.SocketException:Connection Reset
这是HTTPS的TLS版本不一致导致的。
JDK1.8和JDK1.7支持TLS版本
- SSL V3
- TLS V1
- TLS V1.1
- TLS V1.2
但是JDK1.8默认使用TLSV1.2,而JDK1.7默认使用TLS V1。当调用接口TLS版本不同时,便会出现Connection Rest。
解决方法:
在代码中配置默认使用TLS V1.2
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
// jdk1.7 默认为TLSv1
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(createIgnoreVerifySSL(),
// 指定TLS版本
new String[]{"TLSv1.2"},
// 指定算法
null,
// 取消域名验证
new HostnameVerifier() {
@Override
public boolean verify(String string, SSLSession ssls) {
return true;
}
});
CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
factory.setHttpClient(httpClient);
RestTemplate restTemplate = new RestTemplate(factory);
// 解决中文乱码问题
restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
return restTemplate;
SSLContext sc = SSLContext.getInstance("TLSv1.2");
?增加环境变量
-Dhttps.protocols=TLSv1.2
?
|