gpt4 book ai didi

java - SSL 握手在 Java 7 和 Java 8 中的工作原理

转载 作者:太空宇宙 更新时间:2023-11-03 13:15:13 25 4
gpt4 key购买 nike

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

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

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

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

所以我想了解 与 Java 7 或更低版本相比,SSL 握手在 Java 8 中是如何发生的?我可以在 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();
}

~问候,

钱丹

最佳答案

服务器关闭握手,因为客户端使用了不支持的协议(protocol)。参见 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 .

关于java - SSL 握手在 Java 7 和 Java 8 中的工作原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43692884/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com