尽管阅读了有关该主题的多篇 SO 帖子(例如和例如),openssl s_client -showcerts -servername
下载了错误的锚点/根证书,而我的网络浏览器显示了正确的锚点/根证书。
# get the chain of certs
[root@server dir]# openssl s_client -connect www.google.com:443 -servername www.google.com -showcerts 2>&1 < /dev/null | sed -n '/-----BEGIN/,/-----END/p' > chain.pem
[root@server dir]#
# save the chain's certs to files: cert.pem (client/leaf) cert1.pem cert2.pem
[root@server dir]# cat chain.pem | awk 'split_after == 1 {n++;split_after=0} /-----END CERTIFICATE-----/ {split_after=1} {print > "cert" n ".pem"}'
[root@server dir]#
# verify fails
[root@server dir]# openssl verify -trusted cert2.pem -untrusted cert1.pem cert.pem
cert.pem: C = US, O = GeoTrust Inc., CN = GeoTrust Global CA
error 2 at 2 depth lookup:unable to get issuer certificate
# verify succeeds
# openssl verify -trusted ANCHOR-FROM-BROWSER.PEM -untrusted cert1.pem cert.pem
cert.pem: OK
Firefox 正确地说 Google 的锚/根 PEM 包含“AocvmM”,但 openssl 找不到它(顺便说一句,CentOS 7.4 和 Ubuntu 16.04.3 LTS 中的行为相同):
[root@server dir]# openssl s_client -connect www.google.com:443 -showcerts -servername www.google.com 2>&1 < /dev/null | grep AocvmM
[root@server dir]#
问题:为什么 -showcerts 不显示正确的锚/根证书?换句话说,如果不是锚/根,则 -showcerts 显示哪个证书?
答案1
“捆绑包”(具有证书链的文件)中包含的证书列表由提供该页面的 Web 服务器(可能是 Apache)决定。 openssl 无法控制 s_client(或一般的 openssl)是否收到正确且完整的列表。
您需要根证书可以在这个网站上找到。
复制文本,包括来自
-----BEGIN CERTIFICATE-----
直到
-----END CERTIFICATE-----
到一个名为equifax.pem
然后,验证整个链:
$ openssl verify -CAfile equifax.pem -untrusted cert1.pem -untrusted cert2.pem cert.pem
cert.pem: OK
编辑
如果Equifax证书位于默认的本地ssl证书存储库(/etc/ssl/certs/)中,那么这也将起作用:
$ openssl verify -untrusted cert1.pem -untrusted cert2.pem cert.pem
cert.pem: OK
Equifax 证书是否位于 ssl 证书目录是一个单独的问题。你可以更新一下。