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

标签 java spring ssl-certificate resttemplate

我尝试通过 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/

相关文章:

mysql - 我可以在 JPA 中按顺序对值求和吗?

Spring Boot Controller - 枚举参数作为值

python-3.x - 无法安装 python 包 - 找不到合适的 TLS 证书包

java - 打开通知设置页面 android oreo

parsing - 如何使用 JavaMail API 解析 Mbox 文件?

java - Quartz 作业抛出 InvalidDataAccessApiUsageException : no transaction is in progress;

java - 如何使用 junit 测试 @RestController 的 @RequestBody?

http - 在 cpanel 中自动将 http 站点 url 重定向到 https

ssl - 使用证书的 EJBCA Web 管理员的 HA 代理

java - 声明的数组给我 "Exception in thread "main"java.lang.NullPointerException"错误