openssl -showcerts 和 -servername 给出错误的锚/根?

openssl -showcerts 和 -servername 给出错误的锚/根?

尽管阅读了有关该主题的多篇 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 证书目录是一个单独的问题。你可以更新一下。

相关内容