即使信任存储中的根证书无效,java也会引发SSLHandshakeException

即使信任存储中的根证书无效,java也会引发SSLHandshakeException,java,ssl,Java,Ssl,以下java代码: new URL("https://www.limagrain.com/").openStream() 引发以下错误: javax.net.ssl.SSLHandshakeException thrown: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable

以下java代码:

new URL("https://www.limagrain.com/").openStream()
引发以下错误:

javax.net.ssl.SSLHandshakeException thrown: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
但是,该站点()使用的根证书存在于java的信任存储中,并且该站点在浏览器中显示时没有问题

在上检查该站点会给出一个关于标记为额外下载的中间证书的警告

如何让java自动下载中间证书?

解决方案 将系统属性
com.sun.security.enableaiacasuers
设置为
true

System.setProperty("com.sun.security.enableAIAcaIssuers", "true");

请参阅Oracle的Java PKI指南:。

因为您使用的是安全通道https。仅根证书是不够的。您可能需要具有根目录和CA或完整的证书链

第一部分

对授权信息访问(AIA)扩展的支持

支持授权信息的caIssuers访问方法 访问扩展可用。默认情况下,该选项将被禁用 兼容性和可通过设置系统属性启用 com.sun.security.enableaiacassuers将值设置为true

如果设置为true,Sun的CertPathBuilder的PKIX实现将使用证书的AIA扩展中的信息(除了指定的CertStores)来查找颁发CA证书,前提是它是ldap、http或ftp类型的URI

注意:根据您的网络和防火墙设置,它可能是 还需要按照说明配置网络代理服务器 在[网络]中 文档()

第二部分

下面是如何在java证书中手动导入证书链的步骤

  • 在谷歌浏览器中打开,然后按F12
  • 选择安全选项卡并选择突出显示的证书路径
  • 转到“详细信息”选项卡,然后单击“导出到文件”。选择Base 64编码类型
  • 提供证书文件名,然后单击“下一步”和“下一步”
  • 打开证书,查看证书链是否正确导出。

  • 转到command.exe中的%JAVA_HOME%/jre/lib/security

  • 使用下面的命令导入证书链

    keytool-importcert-file limagrain.cer-alias limagrain-keystore cacerts-storepass changeit

  • 注意:确保证书路径正确

  • 在cecerts中填写“是”接受证书

  • 您的见解非常有用!需要“完整的证书链”(或者证书本身),但这是一个持久性差得多的解决方案,因为与根证书相比,服务器证书的更改更频繁。