【问题标题】:How SSL Handshaking works in Java 7 vs Java 8SSL 握手在 Java 7 与 Java 8 中的工作原理
【发布时间】:2017-04-29 07:15:55
【问题描述】:

最近在使用 HttpClient 在 Java 应用程序中访问 3rd 方服务(CURL 服务)时,我遇到了如下问题:

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

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

  • 在您的 JDK 7 信任库中添加该特定第 3 方的证书。 [我尝试过但仍然遇到同样的问题]
  • 使用 JDK 8 而不是 JDK 7 [我试过了,对我有用]

所以我想了解 与 Java 7 或更低版本相比,Java 8 中的 SSL 握手是如何发生的?我可以在 JDK7 中解决这个问题

代码片段

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();
}

~问候,

陈丹

【问题讨论】:

    标签: java ssl httpclient


    【解决方案1】:

    服务器关闭握手,因为客户端使用了不受支持的协议。请参阅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 信任。

    【讨论】:

    • 是的,你是对的。有效。早些时候我也尝试更新 Https 协议版本,但由于其他一些异常,我在添加后再次删除了它,它对我有用......谢谢
    • 您可以通过切换文本左侧的“v”标记“接受”此答案为正确答案
    猜你喜欢
    • 2018-03-31
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-04
    • 2016-09-27
    • 2016-01-26
    • 1970-01-01
    相关资源
    最近更新 更多