我的公司使用自己的 PKI。我用来访问代码存储库的 Web 浏览器显示了一个证书链,如下所示:
Company Root CA
Company Issuing CA Intranet Server
Certificate to the code repository that I want to access
但是,当我尝试使用 Gradle 访问存储库时,我得到一个
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
错误。
Gradle 使用 JVM。我已导出“公司根 CA”证书,并使用以下命令将其添加到 JVM 的证书存储中:
"%JAVA_HOME%\bin\keytool.exe" -import -alias company_root_cacert -file "C:\path\to\company\root\cacert.cer" -keystore "%JAVA_HOME%\jre\lib\security\cacerts" -storepass changeit
然而,这并没有解决问题。我还导出了“Company Issuing CA Intranet Server”证书,并使用以下命令将其添加到 JVM 的证书存储中:
"%JAVA_HOME%\bin\keytool.exe" -import -alias company_intermediate_cacert -file "C:\path\to\company\intermediate\cacert.cer" -keystore "%JAVA_HOME%\jre\lib\security\cacerts" -storepass changeit
这已经解决了这个问题。
我的问题是,为什么第二步是必要的?既然“Company Issuing CA Intranet Server”是由“Company Root CA”签名的,而且我在JVM信任的证书列表中有“Company Root CA”,为什么还要额外添加“Company Issuing CA Intranet Server” " 证书到 JVM 的证书存储区?