Openssl
帶有 -servername 的 openssl -showcerts 給出了錯誤的錨點/根目錄?
儘管閱讀了有關此主題的多個 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可以控制的。
您需要此站點上提供的根證書。
複製文本,包括來自
-----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 證書目錄中是一個單獨的問題。你可以更新它。