【问题标题】:Geting PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException after jdk update获取 PKIX 路径构建失败:jdk 更新后 sun.security.provider.certpath.SunCertPathBuilderException
【发布时间】: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);
            }

        }

【问题讨论】:

    标签: java spring spring-boot ssl


    【解决方案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 进行任何更改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-17
    • 2018-10-04
    • 1970-01-01
    • 2019-06-22
    • 1970-01-01
    • 2019-05-03
    • 1970-01-01
    相关资源
    最近更新 更多