如何使用 openssl 查看证书链

KFM*_*KFM 7 certificate openssl

我混合使用了 Windows、Linux 和 Mac,并注意到每个操作系统使用默认工具显示证书详细信息的方式存在很大差异。

Windows 显示证书详细信息的方式非常简洁。具体来说,证书链。以截图为例。 Windows 证书视图 它再次出现在 Windows 中,但使用的是该certutil工具。(好吧,它正在检查一个 pfx,但你明白了)。 Windows certutil 视图 但是在 Mac 上,这就是它在Keychain Access. Mac 钥匙串访问视图 正如您所看到的,它没有一个很好的分层视图,可以轻松识别 Windows 或certutil显示的证书链- 至少对于我(可能)未经训练的眼睛来说不是这样。我也没有想出一种方法来显示证书链openssl,例如,以下命令openssl x509 -in certificate.crt -text不显示分层链 - 仅显示颁发者。那么有没有办法使用openssl或原生 Mac 工具查看证书链,无论是文本还是图像?

[编辑]:我经常使用整个证书链(禁止根)创建 PFX 文件,以便在我工作的公司内分发。作为该过程的一部分,我会在将其传递给opensslPFX之前仔细检查我从颁发 CA 下载的证书是否正确以及它们的顺序是否正确。所以要清楚,我在质疑如何在我的计算机上查看我正在本地处理的证书链。

Ber*_*ert 6

使用showcerts

openssl s_client -showcerts -connect www.serverfault.com:443
Run Code Online (Sandbox Code Playgroud)

为简洁起见,删除了一些信息的输出:

depth=2 O = Digital Signature Trust Co., CN = DST Root CA X3
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
verify return:1
depth=0 CN = *.stackexchange.com
verify return:1
---
Certificate chain
 0 s:/CN=*.stackexchange.com
   i:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
-----BEGIN CERTIFICATE-----
*REMOVED*
-----END CERTIFICATE-----
 1 s:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
   i:/O=Digital Signature Trust Co./CN=DST Root CA X3
-----BEGIN CERTIFICATE-----
*REMOVED*
-----END CERTIFICATE-----
---
Server certificate
subject=/CN=*.stackexchange.com
issuer=/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
---
No client certificate CA names sent
Peer signing digest: SHA512
Server Temp Key: X25519, 253 bits
Run Code Online (Sandbox Code Playgroud)

  • 当尝试通过 -showcerts 查看证书链时,请注意错误消息“验证错误:num=20:无法获取本地颁发者证书”和消息“验证错误:num=21:无法验证第一个证书”。这似乎意味着 openssl 无法识别链中的证书。当这种情况发生时,它也不会打印完整的链,因此很难弄清楚到底发生了什么。后备 - 使用具有比您的操作系统提供的更大证书存储的浏览器。 (4认同)
  • 感谢您的回答 - 从现有网站检索证书时绝对有效。我应该澄清一下,我正在针对 CA 颁发的证书执行此操作,作为构建证书及其链以用于各种功能的更大任务的一部分。我将编辑我的原始问题以反映这一点。 (2认同)

小智 6

从证书捆绑中,您可以使用crl2pkcs7不限于 CRL:

openssl crl2pkcs7 -nocrl -certfile server_bundle.pem | openssl pkcs7 -print_certs -noout
Run Code Online (Sandbox Code Playgroud)

从实时服务器中,我们需要一个额外的阶段来获取列表:

echo | openssl s_client -connect host:port [-servername host] -showcerts | openssl crl2pkcs7 -nocrl | openssl pkcs7 -noout -print_certs
Run Code Online (Sandbox Code Playgroud)

-servername如果您的主机服务于多个域,请使用该参数来获取正确的证书。