Openssl

帶有 -servername 的 openssl -showcerts 給出了錯誤的錨點/根目錄?

  • January 26, 2018

儘管閱讀了有關此主題的多個 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 證書目錄中是一個單獨的問題。你可以更新它。

引用自:https://unix.stackexchange.com/questions/419747