最近在使用HttpClient访问Java应用程序中的第三方服务(CURL Service)时,我遇到了类似的问题:
javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
....
我在JDK 7中遇到了这个问题。通过对这个问题的一些研究,我找到了2个建议,即
所以我试图像那样理解,与Java 7或更低版本相比,Java 8中的SSL握手是如何发生的?我可以在JDK7中解决这个问题
Code Snnipet
public String getProduct(final String accessToken) throws IOException, ParseException {
log.info("accessToken: " + accessToken);
final String stringUrl = "https://api.molt.in/v1/products";
HttpClient httpClient = HttpClientBuilder.create().build();
HttpGet getRequest = new HttpGet(stringUrl);
getRequest.setHeader("Authorization", "Bearer " + accessToken);
HttpContext httpContext = new BasicHttpContext();
HttpResponse response = httpClient.execute(getRequest, httpContext);
log.info("Response Code : " + response.getStatusLine().getStatusCode());
BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
StringBuffer result = new StringBuffer();
String line = "";
while ((line = rd.readLine()) != null) {
result.append(line);
}
log.info("result: " + result);
rd.close();
return result.toString();
}
〜问候,
CHANDAN
答案 0 :(得分:2)
服务器关闭握手,因为客户端使用不受支持的协议。请参阅this question,其中建议使用以下命令启动Java 7:
-Dhttps.protocols=TLSv1.1,TLSv1.2
如果服务器证书不受信任,您的客户端会收到错误(javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径构建失败),并且它的工作方式如下: Java客户端检查服务器的证书,以确保它正在与之交谈的机器实际上是它声称的那个,在你的例子中#api.molt.in"。检查的工作方式如下:
可以在每个Java次要版本中更新受信任方列表。例如,使用Let's encrypt生成的证书仅受Java 8 since the 101 update信任。