java - 为什么我在尝试通过 REST API 使用数据时收到 SunCertPathBuilderException?
问题描述
我尝试通过 Rest 模板使用 REST API。我在我的信任库中添加了它的证书,但我有一个例外。
证书 DN 是:*.domain.com,我尝试 GET https://api.domain.com
堆栈跟踪:
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:323)
at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:217)
at sun.security.validator.Validator.validate(Validator.java:218)
at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:126)
at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:209)
at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:249)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1284)
... 56 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:174)
at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:238)
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:318)
... 62 more
我的服务方式
HttpHeaders headers = new HttpHeaders();
headers.add("Accept", "application/json");
headers.add("Content-Type", "application/json");
headers.add("authorization", "Bearer " + token);
HttpEntity request = new HttpEntity(headers);
ResponseEntity<String> response = restTemplate.exchange(
https://api.domain.com,
HttpMethod.GET,
request,
String.class,
1
);
System.out.println(response.getStatusCode());
你知道为什么会这样吗?
解决方案
听起来X509TrustManagerImpl
接受证书有问题。当 TLS 证书不是来自受信任的来源(例如自签名或不被 java 信任库接受)时,可能会发生这种情况。
我会尝试使用另一个(更新的)JDK 执行您的代码 - 例如 Oracle 或 Amazon Coretto,其中维护了信任存储并且是最新的。
当它与其他更新的 JDK 一起工作时......
如果这可行 - TLS 证书似乎是有效的。如果您需要使用您的 JDK(例如许可证问题),您可以将证书导入本地信任库。
当它也不能与其他更新的 JDK 一起使用时......
如果这不起作用...查看证书并检查它是否真的可信...可能是一个安全问题...例如中间人攻击(或者只是一个公司代理用证书制作奇怪的东西...)
或者......它只是一个自签名证书,例如在测试服务器上使用。 如果您真的非常确定您可以信任自签名证书(例如,当它是您自己的测试服务器时),您可以将其导入您的信任存储区,或者使用 TRUST_ALL 方法,如:https://github。 com/Daimler/sechub/blob/develop/sechub-adapter/src/main/java/com/daimler/sechub/adapter/support/TrustAllSupport.java
但正确的方法是确保证书是可信的。
推荐阅读
- r - devtools::check() 在 devtools::test() 通过时失败,因为并非 test 中的所有测试文件都复制到 [r]
- python - “'int' 对象不可迭代” Tkinter 按钮
- r - 带有colorRampPalette的viridis在R中输出不同的向量长度
- winapi - 媒体基金会捕获反转图像
- python - 在 Python 中的函数外部设置变量
- sql-server - 根据条件创建 case 和 sum 值
- scala - 将 Spark Dataframe 中的多个列发送到外部 API 并将结果存储在单独的列中
- sql-server - 在 SSIS 中的 Attunity 上运行 SQL 脚本
- python - 如何正确从 CSV 中导入空行字典?
- kubernetes - Kubernetes:如何配置 hostnetwork pod IP 地址?