当前位置: 首页 > 知识库问答 >
问题:

SSL握手在Java7与Java8中的工作原理

弓温书
2023-03-14

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

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

我在JDK7中遇到了这个问题。通过对这一问题的研究,我提出了两点建议。

  • 在JDK7TrustStore中添加该特定第三方的证书。[我试过了,但还是遇到了同样的问题]
  • 使用JDK 8而不是JDK 7[我试过了,它对我有效]
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();
}

单丹

共有1个答案

汝吕恭
2023-03-14

服务器关闭握手,因为客户端使用不受支持的协议。请参见这个问题,其中建议使用以下内容启动Java7:

-Dhttps.protocols=TLSv1.1,TLSv1.2

如果服务器证书不受信任,您将从客户机那里得到一个错误(javax.net.ssl.sslhandShakeException:sun.security.validator.validatoreXception:PKIX path building失败),它是这样工作的:Java客户机检查服务器证书,以确保与它对话的机器实际上是它声称的人,在您的示例“api.molt.in”中。检查的工作方式如下:

  • 如果证书是自签名的,则在默认信任存储区中找到该证书是受信任的
  • 如果证书是由某个机构签署的,则在默认信任存储区中找到该机构的证书,则证书是受信任的。
 类似资料:
  • 堆栈:React,NGINX 1.14.0,GUnicorn,Django 2.2.8,Python 3.6.9 错误: 在浏览器:当React调用Django API(当然在请求头中有)时,大约30秒后在浏览器控制台出现CORS错误。 在浏览器控制台:CORS策略阻止从源“https://mydomain”访问“https://mydomain:8000/somethy/”处的XMLHttpRe

  • 我有以下建立SSL连接的简单代码。 如果我在Java8下运行这段代码,它就不起作用了。它以开始SSL握手时停止。 代理端口:8081 如果删除或将其设置为false,它也不能用于Java10。但是通过系统属性设置代理设置是不起作用的。

  • 我们有一个运行在java 7上的服务器端进程:java-version:java version“1.7.0”java(TM)SE运行时环境(build 1.7.0-b147)java HotSpot(TM)64位服务器VM(build 21.0-b17,混合模式) 它接受来自我们自己开发的java应用程序(通过正确签名的JNLP启动)的SSL连接。 通常情况下,不管客户机应用程序是运行在Java

  • 我使用的是react原生版本0.38,不知怎么的,打开开发者菜单的抖动手势已经停止工作。 设备已连接,我已经反转了8081端口。用于keyevent输入的adb外壳命令(adb外壳输入keyevent 82或KEYCODE_菜单)正在启动后台运行的应用程序。 该设备是一款带有5.1.1的小米红米3。 你知道我怎么打开开发者菜单吗?

  • 我正在学习SSL通信,我遇到了这个问题。我正在编写一个简单的客户端,它试图与本地apache服务器握手。服务器启用https。我将服务器证书添加到所有可能的信任存储(jdk中的一个 注意:我从以下教程中获取了代码: http://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/JSSERefGuide.html#KRB 停留

  • 我通过受ssl v3保护的cxf使用soap服务。我从服务器下载.cer文件,并通过keytool使用以下指令创建JKS文件: 在java代码中,我将此代码用于客户端配置: 对于调用此代码的服务: 当我运行代码时,会发生此错误: 我搜索此错误,我意识到该错误是针对不良信任存储的。但我不知道如何生成正确的信任库。