OpenSSL 檢測 SSL 的憑證串鍊 (Certificate chain)

2018-02-09 Software

昨天接獲報案在公司內網接某台 Server 的 HTTPS 發生 CA 憑證 un trust 的問題,但是去接的 Client Server 本身的 CA 憑證已經有更新過了,也匯入該憑證的 CA Root,但還是無法 trust 憑證。

用可以連接外網的 Browser 去看是正常的,但是 Client Server (無外部網路)去 cURL 一直無法信任。

用 OpenSSL 去測試一看發現該 Server 的 SSL 憑證 Certificate chain 發生斷鍊的情況

一般 Certificate chain 會呈現 server(自身憑證) -> media(中繼憑證) -> root CA(根憑證),這三者是串連在一起的

如果用 OpenSSL 查看遠端站點:

$ openssl s_client -connect shazi.info:443
...
Certificate chain
 0 s:/CN=shazi.info
   i:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
 1 s:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
   i:/O=Digital Signature Trust Co./CN=DST Root CA X3
...

這張憑證是由兩張證書所組成,0 級是該 site 的證書,s 代表該證書的 subject,i 代表頒發該證書的 CA 資訊

正常的 Certificate chain 兩張證書 0 級的頒發 CA 應該要和 1 級的 subject 相同才對的起來,實際上證書可能有多個 Level 要看你的網域等級

例如 www.google.com 就會由三張證書組成 Certificate chain

Certificate chain
0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=www.google.com
i:/C=US/O=Google Inc/CN=Google Internet Authority G2
1 s:/C=US/O=Google Inc/CN=Google Internet Authority G2
i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority

當中繼憑證沒有 import 的時候就會出現斷鍊,但是這一般在 internet 使用者無感,因為現在 Browser 已經很聰明可以去找到對應的 Certificate chain,可是如果你是使用 cURL 或是在沒有 internet 環境的網路,就無法透過網路去找到 Certificate chain。

如果用 OpenSSL 查看 PEM 憑證:

把 Server 的 Cert 憑證和中繼憑證 (Media) 合起來:

$ cat server.crt media.pem > chain.pem

然後就可以用 openssl 把 Certificate chain 列出來。

$ openssl crl2pkcs7 -nocrl -certfile chain.pem | openssl pkcs7 -print_certs -noout

subject=/OU=Domain Control Validated/OU=Gandi Standard SSL/CN=example.com
issuer=/C=FR/ST=Paris/L=Paris/O=Gandi/CN=Gandi Standard SSL CA 2

subject=/C=FR/ST=Paris/L=Paris/O=Gandi/CN=Gandi Standard SSL CA 2
issuer=/C=US/ST=New Jersey/L=Jersey City/O=The USERTRUST Network/CN=USERTrust RSA Certification Authority

subject=/C=US/ST=New Jersey/L=Jersey City/O=The USERTRUST Network/CN=USERTrust RSA Certification Authority
issuer=/C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust External CA Root

避免以防萬一,大家拿到 SSL 證書的時候還是乖乖把中繼憑證加入,並且用 OpenSSL 檢查 Certificate chain 才不會走冤枉路。

參考資料:

2 Replies to “OpenSSL 檢測 SSL 的憑證串鍊 (Certificate chain)”

  1. NC表示:

    請問除了OpenSSL 檢查外,是否也有線上網站可以直接檢測?

給 Mr. 沙先生一點建議

彙整

分類

展開全部 | 收合全部

License

訂閱 Mr. 沙先生 的文章

輸入你的 email 用於訂閱