尽管阅读了有关此主题的多个 SO 帖子(例如和例如),但openssl s_client -showcerts -servername
下载了错误的锚/根证书,而我的 Web 浏览器显示了正确的锚/根证书。
# 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 显示哪个证书,如果它不是锚/根?
“捆绑包”(带有证书链的文件)中包含的证书列表由为页面提供服务的 Web 服务器(可能是 Apache)决定。s_client(或一般的openssl)是否接收到正确和完整的列表不是openssl可以控制的。
您需要此站点上提供的根证书。
复制文本,包括来自
直到
到一个名为
equifax.pem
然后,验证整个链:
编辑
如果 equifax 证书位于默认的本地 ssl 证书存储库 (/etc/ssl/certs/) 中,那么这也可以:
equifax 证书是否在 ssl 证书目录中是一个单独的问题。你可以更新它。