天天看點

浏覽器如何驗證HTTPS證書的合法性?

原作者:小林coding

浏覽器拿到了服務端的數字證書後,要怎麼校驗該數字證書是真實有效的呢?

這個過程很多人沒有關注到,我這裡詳細說下。

數字證書和 CA 機構

在說校驗數字證書是否可信的過程前,我們先來看看數字證書是什麼,一個數字證書通常包含了:

  • 公鑰;
  • 持有者資訊;
  • 證書認證機構(CA)的資訊;
  • CA 對這份檔案的數字簽名及使用的算法;
  • 證書有效期;
  • 還有一些其他額外資訊;

那數字證書的作用,是用來認證公鑰持有者的身份,以防止第三方進行冒充。說簡單些,證書就是用來告訴用戶端,該服務端是否是合法的,因為隻有證書合法,才代表服務端身份是可信的。

我們用證書來認證公鑰持有者的身份(服務端的身份),那證書又是怎麼來的?又該怎麼認證證書呢?

為了讓服務端的公鑰被大家信任,服務端的證書都是由 CA (Certificate Authority,證書認證機構)簽名的,CA 就是網絡世界裡的警察局、公證中心,具有極高的可信度,是以由它來給各個公鑰簽名,信任的一方簽發的證書,那必然證書也是被信任的。

之是以要簽名,是因為簽名的作用可以避免中間人在獲驗證書時對證書内容的篡改。

數字證書簽發和驗證流程

如下圖圖所示,為數字證書簽發和驗證流程:

浏覽器如何驗證HTTPS證書的合法性?

CA 簽發證書的過程,如上圖左邊部分:

  • 首先 CA 會把持有者的公鑰、用途、頒發者、有效時間等資訊打成一個包,然後對這些資訊進行 Hash 計算,得到一個 Hash 值;
  • 然後 CA 會使用自己的私鑰将該 Hash 值加密,生成 Certificate Signature,也就是 CA 對證書做了簽名;
  • 最後将 Certificate Signature 添加在檔案證書上,形成數字證書;

用戶端校驗服務端的數字證書的過程,如上圖右邊部分:

  • 首先用戶端會使用同樣的 Hash 算法擷取該證書的 Hash 值 H1;
  • 通常浏覽器和作業系統中內建了 CA 的公鑰資訊,浏覽器收到證書後可以使用 CA 的公鑰解密 Certificate Signature 内容,得到一個 Hash 值 H2 ;
  • 最後比較 H1 和 H2,如果值相同,則為可信賴的證書,否則則認為證書不可信。

證書鍊

但事實上,證書的驗證過程中還存在一個證書信任鍊的問題,因為我們向 CA 申請的證書一般不是根證書簽發的,而是由中間證書簽發的,比如百度的證書,從下圖你可以看到,證書的層級有三級:

浏覽器如何驗證HTTPS證書的合法性?

對于這種三級層級關系的證書的驗證過程如下:

  • 用戶端收到​​http://baidu.com​​​ 的證書後,發現這個證書的簽發者不是根證書,就無法根據本地已有的根證書中的公鑰去驗證​​http://baidu.com​​​ 證書是否可信。于是,用戶端根據​​http://baidu.com​​ 證書中的簽發者,找到該證書的頒發機構是 “GlobalSign Organization Validation CA - SHA256 - G2”,然後向 CA 請求該中間證書。
  • 請求到證書後發現 “GlobalSign Organization Validation CA - SHA256 - G2” 證書是由 “GlobalSign Root CA” 簽發的,由于 “GlobalSign Root CA” 沒有再上級簽發機構,說明它是根證書,也就是自簽證書。應用軟體會檢查此證書有否已預載于根證書清單上,如果有,則可以利用根證書中的公鑰去驗證 “GlobalSign Organization Validation CA - SHA256 - G2” 證書,如果發現驗證通過,就認為該中間證書是可信的。
  • “GlobalSign Organization Validation CA - SHA256 - G2” 證書被信任後,可以使用 “GlobalSign Organization Validation CA - SHA256 - G2” 證書中的公鑰去驗證​​http://baidu.com​​​ 證書的可信性,如果驗證通過,就可以信任​​http://baidu.com​​ 證書。

在這四個步驟中,最開始用戶端隻信任根證書 GlobalSign Root CA 證書的,然後 “GlobalSign Root CA” 證書信任 “GlobalSign Organization Validation CA - SHA256 - G2” 證書,而 “GlobalSign Organization Validation CA - SHA256 - G2” 證書又信任 ​​http://baidu.com​​​ 證書,于是用戶端也信任 ​​http://baidu.com​​ 證書。

總括來說,由于使用者信任 GlobalSign,是以由 GlobalSign 所擔保的 ​​http://baidu.com​​ 可以被信任,另外由于使用者信任作業系統或浏覽器的軟體商,是以由軟體商預載了根證書的 GlobalSign 都可被信任。

浏覽器如何驗證HTTPS證書的合法性?

作業系統裡一般都會内置一些根證書,比如我的 MAC 電腦裡内置的根證書有這麼多:

浏覽器如何驗證HTTPS證書的合法性?

這樣的一層層地驗證就構成了一條信任鍊路,整個證書信任鍊驗證流程如下圖所示: