首页 > 解决方案 > java如何验证证书以及为什么我得到SSLHandshakeException

问题描述

我正在尝试使用服务器 A 上的服务和服务器 B 上的其他服务中的 RestTemplte 调用 api,但出现以下错误:

sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target; nested exception is javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

即使我将此配置(下面的代码)添加到其余模板中,仍然存在同样的问题。

SSLContext sslContext = new SSLContextBuilder()
                .loadTrustMaterial(new File(keystore), trustStorePassword.toCharArray())
                .build();
        SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(sslContext);
        HttpClient httpClient = HttpClients.custom()
                .setSSLSocketFactory(socketFactory)
                .build();
        HttpComponentsClientHttpRequestFactory factory =
                new HttpComponentsClientHttpRequestFactory(httpClient);
        RestTemplate restTemplate = new RestTemplate(factory);

我在网上找到的解决方案是从 chrome 导出证书并将其添加到 JVM 受信任的证书中。我不知道这是否是正确的解决方案,因为例如我们可以每 3 个月更改一次此证书。

我还有一些其他问题:

先感谢您。

标签: javasslspring-securityssl-certificate

解决方案


验证过程是全自动的,它会拒绝您的证书,因为它对此一无所知。它是不受信任的。

你有两个选择:

  1. 信任所有证书。
  2. 将服务器证书添加到受信任的密钥库。

信任所有证书请参阅此处的 “选项 2”

将服务器证书添加到受信任的密钥库。 下载证书:

openssl s_client -connect SERVER_URL:SERVER_PORT 2>/dev/null </dev/null | \
    sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > server.pem

将证书添加到某个密钥库

keytool -import -alias your-server-name -file server.pem -keystore certs.jks -keypass CERT_PASSWORD -storepass STORE_PASSWORD

这里:

  • your-server-name - 为密钥库中的证书命名
  • certs.jks - 密钥库的路径
  • CERT_PASSWORD - 定义访问证书的密码和
  • STORE_PASSWORD - 访问密钥库的密码

推荐阅读