即使信任库中的根证书,java也会引发SSLHandshakeException

时间:2017-10-25 12:51:02

标签: 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 to find valid certification path to requested target

但是,此站点使用的根证书(Thawte Primary Root CA - G3)存在于java的信任库中,并且该站点在浏览器中显示没有问题。

Qualys SSL checker上检查网站会发出关于标记为额外下载的中间证书的警告。

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

2 个答案:

答案 0 :(得分:2)

正如您所使用的是安全通道https。只是,根证书是不够的。您可能需要拥有Root和CA或完整的证书链。

部分 - 我

支持管理局信息访问(AIA)扩展

  

支持管理局信息的caIssuers访问方法   可以使用访问扩展。默认情况下禁用它   兼容性,可以通过设置系统属性来启用   com.sun.security.enableAIAcaIssuers为值true。

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

  

注意:可能是,具体取决于您的网络和防火墙设置   如上所述,还需要配置网络代理服务器   在[网络   文档(http://docs.oracle.com/javase/8/docs/technotes/guides/net/properties.html)。

第二部分

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

  1. 在Google Chrome中打开https://www.limagrain.com/,然后按F12。
  2. 选择安全选项卡广告选择证书路径为突出显示。
  3. enter image description here

    1. 转到详细信息选项卡,然后单击“导出到文件”。选择Base 64编码类型。
    2. enter image description here

      1. 提供认证文件名,然后单击“下一步”和“下一步”。
      2. enter image description here

        1. 打开证书,查看证书链是否正确导出。 enter image description here

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

        3. 使用以下命令导入证书链。

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

        4. 注意:确保证书路径正确。

          1. 在cecerts中接受证书,写下"是"。

答案 1 :(得分:1)

解决方案

将系统属性com.sun.security.enableAIAcaIssuers设置为true

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

请参阅Oracle的Java PKI指南:https://docs.oracle.com/javase/7/docs/technotes/guides/security/certpath/CertPathProgGuide.html#AppB