以下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自动下载中间证书?
答案 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 :(得分: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。