从服务器的 SSL 证书获取颁发者或主题哈希值

从服务器的 SSL 证书获取颁发者或主题哈希值

有没有办法检查某些服务器的 SSL 证书的主题哈希的颁发者?

我知道curl或者根据特定的哈希在或(或某些其他发行版特定位置)wget中搜索匹配的根证书。/var/lib/ca-certificates/openssl/etc/ssl/certs

我问的原因是有时证书会过期,我需要知道哪些证书文件已过期,以便我可以下载新的证书。但我似乎找不到一种方法(除了使用strace)来查看我需要更新哪些证书。

当我通过 运行命令(curlget)时strace,我可以看到它打开哪个根证书:

$ strace -e trace=open /usr/bin/curl https://git.kernel.org
...
open("/var/lib/ca-certificates/openssl/4042bcee.0", O_RDONLY) = 7
...

我可以获得有关根证书的信息:

$ readlink -f /var/lib/ca-certificates/openssl/4042bcee.0
/var/lib/ca-certificates/openssl/ISRG_Root_X1.pem

$ openssl x509 -noout -issuer -subject -hash -in /var/lib/ca-certificates/openssl/ISRG_Root_X1.pem
issuer= /C=US/O=Internet Security Research Group/CN=ISRG Root X1
subject= /C=US/O=Internet Security Research Group/CN=ISRG Root X1
4042bcee

我看到服务器的证书是由“让我们加密吧”,但它似乎不包含任何可以帮助我找到相关根证书的信息。

curl -sv https://git.kernel.org 2>&1 > /dev/null  |sed -n '/SSL/,/SSL/p'
* SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256
* ALPN, server accepted to use http/1.1
* Server certificate:
*  subject: CN=ams.source.kernel.org
*  start date: Jan 15 18:02:38 2023 GMT
*  expire date: Apr 15 18:02:37 2023 GMT
*  subjectAltName: host "git.kernel.org" matched cert's "git.kernel.org"
*  issuer: C=US; O=Let's Encrypt; CN=R3
*  SSL certificate verify ok.

我还尝试通过以下命令检查主题哈希(我的环境位于代理后面),但它与我所看到的不匹配。

$ openssl s_client -proxy myproxy:myport -connect git.kernel.org:443 -servername git.kernel.org < /dev/null 2>/dev/null | openssl x509 -noout -issuer -subject -hash
issuer=C = US, O = Let's Encrypt, CN = R3
subject=CN = ams.source.kernel.org
1c27cb82

服务器证书的哈希值(1c27cb82)与我自己的证书的哈希值(4042bcee)。

那么如何curl知道wget它应该寻找的根证书的哈希值呢?我如何使用命令行执行相同的操作?

答案1

我已经找到答案了。我只检查了站点的证书,但没有检查整个证书链,最重要的是根CA证书。

为了解决这个问题,我首先必须使用命令-showcerts的标志openssl s_client来显示整个证书链。

然后我openssl循环运行以检查提供的所有证书。我还检查了“-issuer_hash除了” -hash(这是“的同义词-subject_hash”)。

openssl s_client -showcerts -proxy myproxy:myport -connect git.kernel.org:443 -servername git.kernel.org < /dev/null 2>/dev/null | (while openssl x509 -noout -issuer -subject -subject_hash -issuer_hash 2>/dev/null; do true; done)
issuer=C = US, O = Let's Encrypt, CN = R3
subject=CN = ams.source.kernel.org
1c27cb82
8d33f237
issuer=C = US, O = Internet Security Research Group, CN = ISRG Root X1
subject=C = US, O = Let's Encrypt, CN = R3
8d33f237
4042bcee
issuer=O = Digital Signature Trust Co., CN = DST Root CA X3
subject=C = US, O = Internet Security Research Group, CN = ISRG Root X1
4042bcee
2e5ac55d

然后我可以看到预期的哈希值 ( 4042bcee) 作为第三个证书的主题哈希值,以及链中第二个证书的颁发者哈希值。

相关内容