gpt4 book ai didi

java - 为什么我在尝试通过 REST API 使用数据时收到 SunCertPathBuilderException?

转载 作者:行者123 更新时间:2023-12-01 17:58:32 24 4
gpt4 key购买 nike

我尝试通过 Rest 模板使用 REST API。我将其证书添加到我的信任存储中,但有一个异常(exception)。

证书 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

但正确的方法是确保证书是可信的。

关于java - 为什么我在尝试通过 REST API 使用数据时收到 SunCertPathBuilderException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60673877/

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