首页 > 解决方案 > 为什么我在尝试通过 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());

你知道为什么会这样吗?

标签: javaspringssl-certificateresttemplate

解决方案


听起来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

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


推荐阅读