让 gnutls-cli 打印本地根证书以及服务器提供的证书

让 gnutls-cli 打印本地根证书以及服务器提供的证书

我正在诊断 Ubuntu Xenial 中的 TLS 证书验证问题,该问题是由最近的Let's Encrypt 根证书过期。问题发生在使用 GnuTLS 的 cURL 中——所以我用gnutls-cli它来诊断它(当使用时openssl,在证书验证之前就会发生不同的问题——所以它没有用)。

尽管我已经更新了 DST Root CA X3 证书(使用),并通过比较问题机器上apt install ca-certificates的内容(按文件名、大小和 MD5 和)和另一台没有错误的机器上的内容确认,问题仍然存在。比较(GnuTLS 直接使用的文件,据称由从前一个目录自动生成)的内容确实显示了差异,但 DST Root CA X3 证书不在其中。/usr/share/ca-certificates/mozilla//etc/ssl/certs/ca-certificates.crt/usr/sbin/update-ca-certificates

现在我被困在可以重现问题的地步gnutls-cli——但是它没有显示它使用哪个根证书,只有服务器提供的证书链是没问题的:

$ gnutls-cli download.clis.cloud.ibm.com --print-cert </dev/null 2>&1
Processed 129 CA certificate(s).
Resolving 'download.clis.cloud.ibm.com'...
Connecting to '69.192.0.152:443'...
- Certificate type: X.509
- Got a certificate list of 3 certificates.
- Certificate[0] info:
 - subject `CN=cert-00045-cdnedge-bluemix.akamaized.net', issuer `C=US,O=Let's Encrypt,CN=R3', RSA key 2048 bits, signed using RSA-SHA256, activated `2021-10-19 02:05:23 UTC', expires `2022-01-17 02:05:22 UTC', SHA-1 fingerprint `8a13f222870579984cf6a0c6cf8ebfe6f122eb0b'
    Public Key ID:
        8bb871d529bc8edcd0158b6a16787990e7334bc9
    Public key's random art:
<...>
-----BEGIN CERTIFICATE-----
<...>
-----END CERTIFICATE-----
- Certificate[1] info:
 - subject `C=US,O=Let's Encrypt,CN=R3', issuer `C=US,O=Internet Security Research Group,CN=ISRG Root X1', RSA key 2048 bits, signed using RSA-SHA256, activated `2020-09-04 00:00:00 UTC', expires `2025-09-15 16:00:00 UTC', SHA-1 fingerprint `a053375bfe84e8b748782c7cee15827a6af5a405'
-----BEGIN CERTIFICATE-----
<...>
AYYwHQYDVR*** Fatal error: Error in the certificate.
*** Handshake has failed
GnuTLS error: Error in the certificate.
<...>
-----END CERTIFICATE-----
- Certificate[2] info:
 - subject `C=US,O=Internet Security Research Group,CN=ISRG Root X1', issuer `O=Digital Signature Trust Co.,CN=DST Root CA X3', RSA key 4096 bits, signed using RSA-SHA256, activated `2021-01-20 19:14:03 UTC', expires `2024-09-30 18:14:03 UTC', SHA-1 fingerprint `933c6ddee95c9c41a40f9f50493d82be03ad87bf'
-----BEGIN CERTIFICATE-----
<...>
-----END CERTIFICATE-----
- Status: The certificate is NOT trusted. The certificate chain uses expired certificate. 
*** PKI verification of server certificate failed...

所以我无法查看哪个本地证书一直导致问题。有没有办法检索此信息?

答案1

您遇到的问题是,您的 gnutl-cli 命令正在打印出与服务器的 TLS 连接的详细信息。至于证书本身,它只是转储 PEM 编码的证书,然后继续。因此,当您运行 时gnutls-cli download.clis.cloud.ibm.com --print-cert </dev/null 2>&1,它会显示一堆信息,然后显示三个 PEM 编码的证书信息块,位于“-----BEGIN CERTIFICATE-----”行和“-----END CERTIFICATE-----”行之间。这些行之间的内容是实际证书。第一个证书是您的本地证书。第二个是中间证书。第三个是根证书。您需要从第三个证书中捕获证书信息,并使用能够解码这些文本块的工具查看它。

您可以手动复制证书信息(“-----BEGIN CERTIFICATE-----”行和“-----END CERTIFICATE-----”行之间的内容,包括在内)并将其粘贴到某处,然后使用命令查看它openssl x509。或者您可以直接获取 gnutls-cli 的输出并将其直接提供给 openssl。如果这样做,您必须仅捕获第三个证书(您想要查看的根证书)并将其发送到 openssl。我使用 awk 来执行此操作。总之,这有效:

$ gnutls-cli download.clis.cloud.ibm.com --print-cert </dev/null 2>&1 | awk '/Certificate\[2\]/,0' | openssl x509 -noout -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            40:01:77:21:37:d4:e9:42:b8:ee:76:aa:3c:64:0a:b7
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: O = Digital Signature Trust Co., CN = DST Root CA X3
        Validity
            Not Before: Jan 20 19:14:03 2021 GMT
            Not After : Sep 30 18:14:03 2024 GMT
        Subject: C = US, O = Internet Security Research Group, CN = ISRG Root X1
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (4096 bit)
                Modulus:
                    00:ad:e8:24:73:f4:14:37:f3:9b:9e:2b:57:28:1c:
                    87:be:dc:b7:df:38:90:8c:6e:3c:e6:57:a0:78:f7:
<...and so on>

因此,它会按照您的命令执行,将其通过管道传输到 awk,awk 会搜索包含“Certificate[2]”的行以及其后的所有内容,直到文件/文本/流的末尾,然后将其通过管道传输到命令openssl x509。 openssl 命令说“以人类可读的文本格式向我显示此 x509 证书”。我刚才运行此命令时,颁发者 CN 是“DST Root CA X3”。

还要注意:openssl 命令足够智能,可以从您传递给它的所有文本中仅提取 PEM 编码的证书信息。但是如果您不使用 awk 过滤掉之前的证书信息,openssl 将抓取它看到的第一个块(本地安装的证书)并仅显示它。这就是为什么您必须过滤 gnutls-cli 的输出以传递仅包含第三个证书的文本块的原因。

相关内容