java - 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 个月更改一次此证书。
我还有一些其他问题:
JVM 是否知道所有证书颁发机构(我认为有十亿个..),例如当我使用 rest 证书调用 google 时,JVM 会使用“security/cacerts”验证?
我应该在 JVM 受信任的证书中添加我们的证书来修复
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
吗?验证过程不是由 SSL 机制自动进行的吗?
先感谢您。
解决方案
验证过程是全自动的,它会拒绝您的证书,因为它对此一无所知。它是不受信任的。
你有两个选择:
- 信任所有证书。
- 将服务器证书添加到受信任的密钥库。
信任所有证书请参阅此处的 “选项 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 - 访问密钥库的密码
推荐阅读
- laravel - 背包 Laravel select2_from_ajax 字段返回结果,但我无法选择任何
- html - 未应用自定义 CSS 规则
- node.js - 如何将 Angular Universal 9 应用程序部署到生产环境
- python - 从字典列表中提取数据框并合并为一个
- kubernetes - 如何在 Centos7/RHEL7 上安装 kubelet、kubeadm 和 kubectl RPM?
- node.js - Lambda + pg-promise + 事务 = 随机超时
- azure-active-directory - ADB2C 自定义策略用户旅程 - 覆盖每个编排步骤的内容定义
- c++ - 如何按分数升序打印学生姓名
- javascript - 带有 HTML5 Canvas 的 TypeScript 3.9 - .strokeStyle 上的错误
- python - 您可以将函数返回的值保存为单独的变量吗?