如何使用openssl获取根CA证书指纹

时间:2016-08-11 14:32:45

标签: ssl openssl x509 fingerprint

通过使用以下命令,我可以验证所提供证书的sha1指纹:

$ openssl s_client -connect hooks.slack.com:443 -showcerts < /dev/null 2>/dev/null   | openssl x509 -in /dev/stdin -sha1 -noout -fingerprint
SHA1 Fingerprint=AB:F0:5B:A9:1A:E0:AE:5F:CE:32:2E:7C:66:67:49:EC:DD:6D:6A:38

但如果我想获得顶级签名机构的指纹怎么办?

$ openssl s_client -connect hooks.slack.com:443 < /dev/null 2>/dev/null
CONNECTED(00000003)
---
Certificate chain
 0 s:/C=US/ST=California/L=San Francisco/O=Slack Technologies, Inc/CN=*.slack.com
   i:/C=US/O=GeoTrust Inc./CN=GeoTrust SSL CA - G3
 1 s:/C=US/O=GeoTrust Inc./CN=GeoTrust SSL CA - G3
   i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA <- **I WANT THIS SHA1**

如果我想针对Java密钥库验证这一点,请确定它是否包含相同的CA.

geotrustglobalca, 18-Jul-2003, trustedCertEntry,
Certificate fingerprint (SHA1): DE:28:F4:A4:FF:E5:B9:2F:A3:C5:03:D1:A3:49:A7:F9:96:2A:82:12

由于“geotrustglobalca”和“/ C = US / O = GeoTrust Inc./CN=GeoTrust Global CA”并不具有可比性。

3 个答案:

答案 0 :(得分:1)

  

从&#34; geotrustglobalca&#34;和&#34; / C = US / O = GeoTrust Inc./CN=GeoTrust Global CA&#34;并不是真正具有可比性。

我会躲进游泳池,回答&#34; X.509证书等效&#34;因为它不容易明白或容易得到。

首先,您应该小心比较证书的相等性。如果<certificate bits 1> == <certificate bits 2>,那么您可以说它们是完全相同的证书并且相同。但是,反过来并不成立。

要理解相反的观点,你需要知道两件事。首先,CA有时会重新颁发具有几乎相同参数的证书。根据主题名称,它们是等同的;但基于它们不相等的位。一些CA在过去已经做到这一点,从SHA-1到SHA-256。

要理解的第二件事是,重要的是什么,以便您可以确定证书是否相同。 IETF没有X.509验证文档。最接近的是RFC 4158: Internet X.509 Public Key Infrastructure: Certification Path Building,与其他一些文档混合使用,例如发布规则(与验证规则不同)。

根据RFC 4158,您可以使用以下任一方式唯一标识证书:

  • {Issuer DN, Serial Number}
  • {Authority Key identifier (AKID), Subject Key identifier (SKID)}

CA重新颁发根CA的极端情况导致:

  1. 哈希更改
  2. 序列号更改
  3. 公钥仍然是
  4. 杰出名称仍然是
  5. 项目(3),公钥,非常重要,因为它既不是授权密钥标识符(AKID),也不是主题密钥标识符(SKID) )更改。第(4)项,专有名称仍为,非常重要,因为它是许多人用于比较的原因(多年来它一直是许多安全漏洞的原因)。

    在这种情况下,密钥标识符将是相同的,因此即使序列号已更改,您也应该考虑接受。 (序列号必须根据IETF和CA / B规则进行更改。)

    最近在公钥固定中出现的一个奇怪的角落案例是,服务器使用域参数呈现椭圆曲线证书(pgQ的完全展开等等),但客户需要一条命名曲线(如secp256r1)。该密钥应该被认为是等同的吗? (IETF说证书必须使用指定的曲线)。

    鉴于上述信息,此信息在您的比较中毫无用处:

    • "geotrustglobalca"

    此信息对您的比较不完整:

    • "/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA"

    在这种情况下,你应该谨慎行事,拒绝相等或同等的比较。

答案 1 :(得分:1)

在类似的情况下,在共享托管解决方案上使用let加密证书,我成功指定了servername参数:

openssl s_client -connect hooks.slack.com:443 -servername hooks.slack.com -showcerts < /dev/null 2>/dev/null   | openssl x509 -in /dev/stdin -sha1 -noout -fingerprint

答案 2 :(得分:0)

我不确定这会直接回答您的问题,但如果服务器将根证书作为链的一部分提供(这是可选的,因此可能不是),您可以使用-showcerts选项显示所有这些

我之前将它放在一起(希望有人可以改进),以获得每个证书的指纹。如果需要,您可以在最后使用openssl x509的参数来获取不同的信息。

echo "" | openssl s_client -showcerts -connect eistest.mtsu.edu:443 2>&1 |\ 
sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p;/-END CERTIFICATE-/a\\x0' |\ 
sed -e '$ d' |\ 
xargs -0rl -I% sh -c "echo '%' | openssl x509 -subject -issuer -fingerprint -noout"

将空字符串回送给openssl s_client使其无法等待连接超时。 第一个sed将仅输出PEM格式的证书,由NUL字符分隔。