用于检查证书是否已存在于Java密钥库中的非progamatic方法

时间:2017-02-08 19:05:15

标签: java ssl keystore keytool

使用keytool命令或其他一些非编程方式,我想检查Java密钥库中是否存在给定证书。我知道编程方式,但我希望从keytool命令或其他非编程方式实现相同的方法。我知道如何在密钥库中查看当前的证书,检查它们的别名等,但所有这些并不能帮助我确保密钥库中存在给定的证书。有什么办法吗?

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

2 个答案:

答案 0 :(得分:0)

今天我必须精确地做到这一点,这就是我最终在没有有效答案的情况下遇到这个问题的原因。

这就是我最后要做的。

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

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"

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

答案 1 :(得分:0)

您不需要先检查。如果您执行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