Java 开箱即用的 cacerts 证书是 SHA1,有没有 SHA2

Java 开箱即用的 cacerts 证书是 SHA1,有没有 SHA2

Java/JDK/JRE 在 lib\Security 文件夹下有一个密钥库 cacerts,如下所示

在此处输入图片描述

Java 附带大约 93 个证书,这些证书不是自签名的,而是由 Java 本身提供的

在此处输入图片描述

这些证书是 SHA1 证书

背景

我们使用的应用程序依赖于 Java,而我们的公司表示他们正在放弃 SHA1,并希望将这些 SHA1 更改为 SHA2。

问题

  1. 是否有某个版本/类型的 Java 使用 SHA2 作为开箱即用的证书?
  2. 是否可以用 SHA2 替换现成的证书?

答案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

相关内容