答案1
这是一个迟来的回复,但问题中有一个重要的误解,应该为未来的读者澄清。Keytool 输出可能会产生误导:它显示了一个 SHA1指纹对于所有证书,无论它们使用 SHA1 还是 SHA2签名哈希函数(这就是您要找的)。SHA1 指纹只是证书的唯一 ID。
要查找捆绑包中的 SHA2 证书,您不能依赖 keytool -list。您需要使用 keytool -exportcert 提取所有证书,然后使用 keytool -printcert 检查每个证书的详细信息:SHA2 证书将在输出中包含以下行:
Signature algorithm name: SHA256withRSA
自 JRE 1.6.14 以来,SHA2 CA 证书就已成为标准 Java cacerts 包的一部分(参见证书 ttelesecglobalrootclass3ca),甚至更早。
答案2
当 CA 提供商将其证书升级到 SHA-2 时,他们会提交新证书以纳入使用 SSL 的各种产品(例如浏览器和 Java)。
显然,给定产品的旧版本不会有较新的证书(没有自动升级它们的机制)。
如果提供商不提交新证书,它将不会包含在 Java 中,您必须手动将新证书添加到 Java 受信任的证书存储库中。
因此,如果您收到如下错误:
javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX 路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效认证路径
...那么你可能没有正确的CA 根证书,您需要手动下载证书并将其安装到 Java 受信任证书密钥库中。以下是执行此操作的方法:http://mikepilat.com/2011/05/adding-a-certificate-authority-to-the-java-runtime.html