获取 PKIX 路径构建失败:jdk 更新后 sun.security.provider.certpath.SunCertPathBuilderException

Posted

技术标签:

【中文标题】获取 PKIX 路径构建失败:jdk 更新后 sun.security.provider.certpath.SunCertPathBuilderException【英文标题】:Geting PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException after jdk update 【发布时间】:2020-06-17 19:21:17 【问题描述】:

将 java 版本从 1.8.0_231 更新到 1.8.0_241 后,我收到与证书配置相关的错误。

在 Spring Boot 启动期间,我正在设置 keystore 和 keystorepass 并在 Spring 框架提供的 RestTemplate 的帮助下进行休息调用。

调用休息服务后,我得到 sun.security.validator.ValidatorException: PKIX 路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException: 无法找到请求目标的有效证书路径;嵌套异常是 javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX 路径错误。

相同的代码在 JDK 1.8.0_231 上运行良好。任何人都可以帮助我造成问题的原因。

我配置keystore和keystorepassowrd如下图

        System.setProperty("javax.net.ssl.keyStore", environment.getProperty("javax.net.ssl.keyStore"));
        String pswd = null;
        try (BufferedReader br = new BufferedReader(
                new InputStreamReader(new 
        FileInputStream(environment.getProperty("javax.net.ssl.keyStorePassword")), Charset.defaultCharset()))) 
            pswd = br.readLine();
            if (pswd != null) 
                System.setProperty("javax.net.ssl.keyStorePassword", pswd);
            

        

【问题讨论】:

【参考方案1】:

首先检查JDK 1.8.0_231/jre/lib/security目录中的cacert文件和jre目录中相同位置的相同文件。首先尝试复制安全文件并粘贴到具有上述位置的另一个版本的 java 中。它应该可以解决问题。

【讨论】:

具体检查cacerts文件。 我使用 pkcs(.p12) 作为我的密钥库,并在应用程序启动期间从文件系统加载此文件并将其设置为 javax.net.ssl.keyStore 系统属性。在此情况是否实际需要修改 JDK_HOME/jre/lib/security/cacerts 文件。我没有对运行良好的旧 jdk 的 cacerts 进行任何更改。 @Deb @Deb 你能告诉我你指的是哪些安全文件 正如 Karthik 提到的 cacert 文件【参考方案2】:

PKIX 路径构建失败

这意味着信任证书存在问题。所以问题出在您的信任库上。由于问题在更新 JDK 后开始出现,您可能使用的是名为“cacerts”的标准 java 信任库。您可以在 JDK_HOME/jre/lib/security/cacerts 中找到它。

将此文件从旧 JDK 复制到新 JDK 并测试问题是否已解决。 最好的解决方案是然后将您需要的证书从旧的 cacerts 复制到新的证书,而不是覆盖它。这是因为新的 cacerts 文件将保存来自受信任的根方的新证书,这些证书不会在旧证书中。

我建议使用带有 UI 的应用程序,例如 https://keystore-explorer.org/,来执行此操作。它让您可以拖放或复制粘贴证书。

【讨论】:

我使用 pkcs(.p12) 作为我的密钥库,并在应用程序启动期间从文件系统加载此文件并将其设置为 javax.net.ssl.keyStore 系统属性。在此情况是否实际需要修改 JDK_HOME/jre/lib/security/cacerts 文件。我没有对运行良好的旧 jdk 的 cacerts 进行任何更改。

以上是关于获取 PKIX 路径构建失败:jdk 更新后 sun.security.provider.certpath.SunCertPathBuilderException的主要内容,如果未能解决你的问题,请参考以下文章

PKIX 路径构建失败:wso2 oauth

“PKIX 路径构建失败”和“无法找到请求目标的有效证书路径”

Centos 7 中的 PKIX 路径构建失败

PKIX 路径构建失败:

PKIX 路径构建失败:我将证书添加到 carcert 仍然失败

SSLHandshakeException:PKIX 路径构建失败