天天看點

關于SSL證書鍊的一些認識

一、數字證書的基礎知識

數字證書是用來認證公鑰持有者身份合法性的電子文檔,以防止第三方冒充行為。數字證書由 CA(Certifacate Authority) 負責簽發,關鍵内容包括 頒發s者、證書有效期、使用者組織、使用者公鑰 等資訊。數字證書涉及到一個名為 PKI(Public Key Infrastructure) 的規範體系,包含了數字證書格式定義、密鑰生命周期管理、數字簽名及驗證等多項技術說明,不在這篇筆記中詳細展開。

我們借助下面的流程,看看 CA 是如何簽發一張證書,使用者又是如何驗證這樣證書的。這又涉及到了數字簽名技術,數字簽名技術又是基于公鑰密碼技術。

現實世界中,簽名是針對承諾的一種表現形式,手手段可以通過手寫簽字或蓋扣印章;而在數字世界中,簽名仍然是為了表示承諾,隻是手段變成了二進制。

好,我們來看看 CA 數字簽名包括兩個過程:簽發證書(Signing) 和 驗證證書(Verification)

關于SSL證書鍊的一些認識

數字簽名與驗證

簽發證書的過程

  1. 撰寫證書中繼資料:包括 簽發人(Issuer)、位址、簽發時間、有效期 等,還包括證書持有者(Owner)基本資訊,比如 DN(DNS Name,即證書生效的域名)、 Owner 公鑰 等資訊
  2. 使用通用的 Hash 算法(如SHA-256)對證書中繼資料計算生成 數字摘要
  3. 使用 Issuer 的私鑰對該數字摘要進行加密,生成一個加密的數字摘要,也就是Issuer的 數字簽名
  4. 将數字簽名附加到數字證書上,變成一個 簽過名的數字證書
  5. 将簽過名的數字證書與 Issuer 的公鑰,一同發給證書使用者(注意,将公鑰主動發給使用者是一個形象的說法,隻是為了表達使用者最終擷取到了 Issuer 的公鑰)

驗證證書的過程

  1. 證書使用者獲通過某種途徑(如浏覽器通路)擷取到該數字證書,解壓後分别獲得 證書中繼資料 和 數字簽名
  2. 使用同樣的Hash算法計算證書中繼資料的 數字摘要
  3. 使用 Issuer 的公鑰 對數字簽名進行解密,得到 解密後的數字摘要
  4. 對比 2 和 3 兩個步驟得到的數字摘要值,如果相同,則說明這個數字證書确實是被 Issuer 驗證過合法證書,證書中的資訊(最主要的是 Owner 的公鑰)是可信的

上述是對數字證書的簽名和驗證過程,對普通資料的數字簽名和驗證也是利用了同樣的方法。

我們再來總結一下“簽發證書”與“驗證證書”兩個過程,Issuer(CA)使用 Issuer 的私鑰 對簽發的證書進行數字簽名,證書使用者使用 Issuser 的公鑰 對證書進行校驗,如果校驗通過,說明該證書可信。

由此看出,校驗的關鍵是 Issuer 的公鑰,使用者擷取不到 Issuer 的私鑰,隻能擷取到 Issuer 的公鑰,如果 Issuer 是一個壞家夥,誰來證明 Issuer 的身份 是可信的?

這就涉及到一個信任鍊條了,也是這篇筆記本身要講述的事情,證書鍊。

二、什麼是證書鍊?

有兩種類型的證書機構(CA) :根CA和中間CA。為了使SSL證書受信任,該證書必須由正在連接配接的裝置的受信任存儲區中包括的CA頒發。

如果證書不是由受信任的CA頒發的,則連接配接裝置(例如Web浏覽器)将檢查以檢視頒發CA的證書是否由受信任的CA頒發。它會繼續檢查,直到找到受信任的CA(此時将建立受信任的安全連接配接),或者找不到受信任的CA(此時裝置通常将顯示錯誤)。

從根證書到最終使用者證書的SSL證書清單代表SSL證書鍊。

下面以百度為例,在浏覽器上通路 “www.baidu.com” 域名,位址連左側有一個小鎖的标志,點選就能檢視百度的數字證書,如下圖所示(使用的是Edge浏覽器)

關于SSL證書鍊的一些認識

百度數字證書

在圖檔的頂部,我們看到這樣一個層次關系:

GlobalSign Root CA -> GlobalSign Organization Validation CA -> baidu.com

這個層次可以抽象為三個級别:

  1. end-user:即 baidu.com,該證書包含百度的公鑰,通路者就是使用該公鑰将資料加密後再傳輸給百度,即在 HTTPS 中使用的證書
  2. intermediates:即上文提到的 簽發人 Issuer,用來認證公鑰持有者身份的證書,負責确認 HTTPS 使用的 end-user 證書确實是來源于百度。這類 intermediates 證書可以有很多級,也就是說 簽發人 Issuer 可能會有有很多級
  3. root:可以了解為 最進階别的簽發人 Issuer,負責認證 intermediates 身份的合法性

這其實代表了一個信任鍊條,最終的目的就是為了保證 end-user 證書是可信的,該證書的公鑰也就是可信的。

關于SSL證書鍊的一些認識

證書鍊

結合實際的使用場景對證書鍊進行一個歸納:

  1. 為了擷取 end-user 的公鑰,需要擷取 end-user 的證書,因為公鑰就儲存在該證書中
  2. 為了證明擷取到的 end-user 證書是可信的,就要看該證書是否被 intermediate 權威機構認證,等價于是否有權威機構的數字簽名
  3. 有了權威機構的數字簽名,而權威機構就是可信的嗎?需要繼續往上驗證,即檢視是否存在上一級權威認證機構的數字簽名
  4. 信任鍊條的最終是Root CA,他采用自簽名,對他的簽名隻能無條件的信任
關于SSL證書鍊的一些認識

證書鍊逐級認證

說到無條件信任,也不用奇怪,尤瓦爾赫拉裡在《人類簡史》中已經闡述過,基于虛構故事所建立的信任,最終将人類待到了今天。

還有一個小問題,Root 根證書從何而來呢?除了自行下載下傳安裝之外,浏覽器、作業系統等都會内置一些 Root 根證書,稱之為 Rrusted Root Certificates。比如 Apple MacOS 官網就記錄了作業系統中内置的可信任根證書清單。

macOS High Sierra 中可用的受信任根證書清單

參考:What is the SSL Certificate Chain?