如何使用 openssl 查看证书链

如何使用 openssl 查看证书链

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

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

[编辑]:我经常创建包含整个证书链(根证书除外)的 PFX 文件,以便在我工作的公司内分发。作为此过程的一部分,我会仔细检查从颁发 CA 下载的证书是否正确,以及它们的顺序是否正确,然后再将其传递给opensslPFX 以生成证书。因此,为了清楚起见,我想知道如何在我的计算机上本地查看我正在处理的证书链。

答案1

使用showcerts

openssl s_client -showcerts -connect www.serverfault.com:443

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

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

答案2

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

openssl crl2pkcs7 -nocrl -certfile server_bundle.pem | openssl pkcs7 -print_certs -noout

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

echo | openssl s_client -connect host:port [-servername host] -showcerts | openssl crl2pkcs7 -nocrl | openssl pkcs7 -noout -print_certs

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

答案3

我无法帮助其他 Mac 工具,包括本机工具。OpenSSL 是一个没有 GUI 的纯命令行产品,当然,您可以使用库部分 (libcrypto) 并编写自己的 GUI。

从命令行,openssl verify如果可能的话,将构建(并验证)从您提供的每个叶证书到中间证书(可以重复)的链-untrusted,以及可能更多的中间证书到根(或锚点)的链-trusted 或者 -CAfile和/或-CApath 或者默认信任库,通常由您的系统或构建决定,但可以使用环境变量覆盖。如果失败,则会给出错误。在 1.1.0 及以上版本中,如果成功并且您还指定-show_chain,它会显示每个证书的主题名称——这可能足以识别它们,也可能不足以识别它们。如果每个主题只有一个证书,那就相当容易了。如果您有来自不同颁发者的同一主题的证书,请查看下一个证书的名称(最后一个除外,除非您还使用,否则它是自签名的-partial_chain)就足够了。如果您有同一主题的多个证书发行人则比较难。

我经常创建包含整个证书链(根证书除外)的 PFX 文件,以便在我工作的公司内分发。作为此过程的一部分,我会仔细检查从颁发 CA 下载的证书是否正确,以及证书的顺序是否正确,然后再将其传递给 openssl 以创建 PFX。

除了“禁止根”部分,您可以反转此工作流程。您无需手动构建和检查链然后使用它,而是可以使用openssl pkcs12 -export -chain并提供可能的链证书作为(或在)-CAfile和/或-CApath。这将构建链(实际上验证它也是副作用)并创建一个包含仅有的如果成功,则私钥和叶子加上有效链,但如果不成功,则会给出错误并且不创建任何输出 - 例如,如果您没有有效的链。

答案4

我知道我来晚了。但我也在寻找相同问题的解决方案。在谷歌上搜索了 20 分钟后,终于找到了答案。

如果证书链保存为 Base64:

openssl pkcs7 -in certificate_chain.p7b -noout -text -print_certs

如果证书链保存为 DER:

openssl pkcs7 -inform DER -in certificate_chain.p7b -noout -text -print_certs

相关内容