我有一个Web服务器,它通过HTTPS托管webapplication和rest API。服务器上安装了由赛门泰克签名的 *.thedomain.com 证书。"thedomain"用于示例目的。这不是实际的域。
我认为信任链没有问题,因为服务器提供的证书在任何浏览器的默认设置下都被接受,而无需执行任何操作。
现在,我正在尝试为该服务器提供的其余 API 创建一个 Java 客户端。
问题是抛出对请求目标的sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path
。如果我理解正确,这意味着 JDK 支持的 ca 不提供允许正确验证服务器的有效证书路径。
仍然能够认证服务器的同时,这个错误的好解决方案是什么?为什么 Web 浏览器能够对服务器而不是 JDK 进行身份验证 (7) ?
它在浏览器中工作,因为 CA 证书位于浏览器的密钥环中,而不是 JDK 使用的密钥环中。
使用keytool
将 CA 证书添加到 JDK 密钥环,如下所示:
keytool -keystore cacerts -importcert -alias aliasOfTheCertificate -file FileNameOfTheCertificate.cer
从命令行。请注意,许多 Linux 发行版已经发布了包含所有受信任根的 ca-certs-java 包,如果可能的话,请尝试使用它。
所以,这里有几个想法。
1.)赛门泰克似乎相当新,可能不在您使用的cacerts文件中。 您是否尝试过最新版本的 jdk/jre?
2.) 我建议使用 InstallCert 应用程序创建一个新的 cacerts 文件,该文件将信任您站点的证书。 您需要在 VM 参数中使用 -Djavax.net.ssl.trustStore 和 -Djavax.net.ssl.trustStorePassword 参数指向新的 cacerts 文件。