【问题标题】:Non-progamatic way to check if certificate is already present in java keystore检查证书是否已存在于 java 密钥库中的非编程方法
【发布时间】:2017-06-26 13:39:24
【问题描述】:

使用keytool 命令或其他一些非编程方式我想检查Java 的密钥库中是否存在给定的证书。我知道编程方式,但我想通过keytool 命令或其他一些非编程方式来实现相同的目的。我知道如何查看密钥库中存在的证书、检查它们的别名等,但所有这些都无助于确保给定的证书存在于密钥库中。有什么办法吗?

我已经阅读了this question 并且这些不是重复的,因为那是为了检查“密钥库文件中的证书名称和别名”,我不想检查,我想确保给定的证书存在于密钥库中这样当我与将返回给定证书的服务器通信时,我的通信就会成功;给定的证书可以具有相同的别名,但如果不是相同的证书,则其指纹会有所不同。

【问题讨论】:

  • @acm 不,不是,这个问题是检查“密钥库文件中的证书名称和别名”,我想确保密钥库中存在给定的证书,给定的证书可以具有相同的别名但是如果不是同一个证书,它的指纹会有所不同。
  • 您想知道证书是否存在于特定别名下,还是您想知道证书是否存在于密钥库的任何别名下?
  • @VGR 我有一个密钥库,它有我与之进行 SSL 通信的服务器的证书,现在我有了另一个我想通过 HTTPS 通信的服务器,该服务器为我提供了他们的 SSL 证书,现在我想检查他们的根 CA 的证书是否存在于我的密钥库中? (当然他们的 SSL 证书不会出现在我的信任库中,我也不想添加主服务器证书,我总是添加根证书或中间 CA 证书),以便我知道我与他们的 SSL 通信是否会成功。如果我不清楚,请告诉我,您也需要了解更多信息。
  • @VGR 你能抽出时间告诉我上述后续问题的答案吗?
  • 我相信链接的重复问题仍然可以回答您的问题。请注意,其中一个答案建议使用 keytool 的 -v 选项,它可以让您检查每个现有证书的指纹。

标签: java ssl keystore keytool


【解决方案1】:

您无需先检查。如果您执行keytool -importcert 并且证书已经存在(在 any 别名下)keytool 会告诉您

 Certificate already exists in keystore under alias <whatever>
 Do you still want to add it? [no]:

只需点击 return 或 EOF -- 或通过管道从 echo 或从 /dev/null 重定向(在 Windows 上为 NUL:)提供。当然,如果您自动执行此操作,它也会取消在密钥库中添加的证书,因此您必须查看输出(例如grep)并决定是否重复添加操作,这次回答yes 或(等效地)使用-noprompt

【讨论】:

    【解决方案2】:

    今天我不得不这样做,这就是我在没有有效答案的情况下结束这个问题的原因。

    这就是我最终要做的。

    首先,我从我的证书颁发机构下载了证书。 然后我得到了他们的指纹,例如

    keytool -printcert -v -file GeoTrustTLSRSACAG1-Intermediate-Certificate.cer
    

    这会产生如下输出:

    Certificate fingerprints:
         MD5:  05:EE:9C:2A:C6:6F:75:D9:64:AC:5F:1A:3C:7D:E7:5D
         SHA1: 8B:3C:5B:9B:86:7D:4B:E4:6D:1C:B5:A0:1D:45:D6:7D:C8:E9:40:82
         SHA256: C0:6E:30:7F:7C:FC:1D:32:FA:72:A4:C0:33:C8:7B:90:01:9A:F2:16:F0:77:5D:64:97:8A:2E:CA:6C:8A:23:0E
         Signature algorithm name: SHA256withRSA
         Version: 3
    

    此时我复制了 SHA1 指纹,然后检查我的 cacert 文件中是否已经有了它:

    keytool -keystore $JAVA_HOME/jre/lib/security/cacerts -list -storepass changeit | \
      grep "8B:3C:5B:9B:86:7D:4B:E4:6D:1C:B5:A0:1D:45:D6:7D:C8:E9:40:82"
    

    如果找到匹配项,则表示您已经拥有证书,否则,您没有,您可能需要将其添加到密钥库中。

    【讨论】:

    • 仅供参考 that cert 不是根证书(或就此而言的根 CA),它应该在 this root 下验证,从 8u91 开始,它已经在每个 Oracle JDK 中作为“digicertglobalrootg2”跨度>
    猜你喜欢
    • 1970-01-01
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 2011-09-21
    • 2016-02-15
    • 2018-04-20
    • 2019-07-24
    相关资源
    最近更新 更多