那些關於SSL/TLS的二三事(十二) — Chain of Trust

所謂的信任鍊

Carl
5 min readMay 24, 2018

這篇要介紹的是信任鍊 (chain of trust), 在實務上, SSL 憑證通常不是直接由 Root CA 進行簽核的, 在這個過程中可能會有多個受信任的 CA 參與. 其中, Root CA 又被稱為信任錨 (trust anchor), 除了 Root CA 外, 所有其它參與建立信任關係的 CA 又被稱為中介 CA (intermediate CA), 而這段被建立起來的信任關係就稱為信任鍊 (chain of trust).

所以, 我們可以說信任鍊是從簽核了中介 CA 的 trust anchor 開始的, 而中介 CA 也可以簽核其它的中介 CA, 至於信任鍊中的最後一個中介 CA, 則是負責幫送出簽核請求的網站進行簽核葉憑證 (leaf certificate)的角色. 這看起來好像把事情搞得越來越複雜了, 為什麼我們會需要中介 CA 呢?

試想一下, 如果有一個 Root CA 簽核了數以千計來自各個網站的 CSR, 那麼當這個 CA 的私鑰被攻擊之後, 會發生什麼事呢? 在這種情境下, 基本上是會影響到所有被這個 Root CA 簽核過的網站的, 因為這些網站都必需要撤銷憑證才行了. 這就是需要中介 CA 的原因, 因為中介 CA 的存在可以降低曝露 Root CA 的簽名的風險, 所以一旦一個中介 CA 的憑證被簽核了, 其就可以用來簽署更多下游的憑證. 對某些 CA 來說, 其可能還擁有多達五層的中介 CA.

Chain of Trust

以圖中的信任鍊為例, Google.com 的葉憑證並不是直接由 Root CA 進行簽核的, 而是由 Google 自己的中介 CA (GIA) 進行簽合的, 而 GIA 又是被 GeoTrust 簽核的, 最後, GeoTrust 才是由 Root CA 進行簽核的.

你可以用以下指令來觀察信任鍊的內容, 看簽核的關係是長什麼樣子的:

$ openssl s_client -connect qualys.com:443 < /dev/null

當一個網站請求一個憑證時, 其會得到葉憑證以及中介憑證. 這些基本上都是要被部署到網站上的, 以利瀏覽器對信任鍊進行驗證. 所以實際上在 SSL handshake 的 “server hello” 之回傳結果中, 可能都會有一大票的憑證出現, 當中若有任何一個中介憑證出錯或是不見了, 都會導致 SSL handshake fail.

信任鍊如何被客戶端驗證?

下面這張圖描繪了 leaf, intermediate 以及 root certificate 如何彼此相連進而構成信任鍊.

Verify the Chain of Trust

在上圖中, 瀏覽器代表了 client, 而發行給 Google 的 leaf certificate, intermediate certificate 以及 root certificate 都是瀏覽器的 cert store 中的一部份. 如這系列文章一開始所說的, 主流 CA 的 root certificate 基本上都是瀏覽器應用程式出廠時的一部份.

在 handshake 的過程中, 瀏覽器首先會讀取 leaf certificate 並且找出其發行單位, 照上圖的話就是 GIA, 所以很明顯地, GIA 在這個 case 中就是一個 intermediate CA. 再來瀏覽器會從 cert store 中查看 GIA 的 public key, 若存在, 則拿來驗證 leaf certificate 上的簽章, certificate 的驗證過程就算完成了, 否則瀏覽器就會去 intermediate cert list 中尋找 GIA 的 certificate, 然後再從找到的 certificate 中取出 public key, 然後才去驗證 leaf certificate. 接下來, 瀏覽器需要去驗證 GIA 的 intermediate certificate, 同樣的步驟會再執行一次, 當瀏覽器識別出 GIA 的 certificate 是由 GeoTrust 簽核的之後, 其就會試著從 cert store 中去尋找 GeoTrust的 public key. 若存在, 就會從 GeoTrust 的 certificate 中讀取 public key 並且用來驗證 GIA certificate 中的簽章. 最後, 瀏覽器發現 GeoTrust 的 certificate 是由 Equifax 簽核的, 且這是 root certificate (就在瀏覽器的 cert store 中), 則瀏覽器就會讀取出相應的 public key 並且驗證 GeoTrust 的 certificate. 到此, 就完成了信任鍊的驗證流程.

至於 leaf certificate 的 public key 要做什麼呢? 上面好像都沒提到? 關於這部分, 其實前面的文章已經討論過了, leaf certificate 的 public key 是用來讓 client 將 PMS (pre-master secret) 安全地送至 server 用的.

References

  • SSL/TLS Operations

--

--

Carl

Stand for something or you will fall for anything.