SSL握手如何在Java 7和Java 8

时间:2017-04-29 07:15:55

标签: java ssl httpclient

最近在使用HttpClient访问Java应用程序中的第三方服务(CURL Service)时,我遇到了类似的问题:

javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
....

我在JDK 7中遇到了这个问题。通过对这个问题的一些研究,我找到了2个建议,即

  • 在JDK 7 Truststore中添加该特定第三方的证书。 [我试过但仍然有同样的问题]
  • 使用JDK 8而不是JDK 7 [我试过并且它对我有用]

所以我试图像那样理解,与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

1 个答案:

答案 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信任。