這篇很好
個人總結:
1. 用戶端向服務端發其請求,服務端發送證書。
2.用戶端本地有内置的證書簽發機構對應的公鑰,用戶端使用公鑰解密簽名,然後自己計算hash看是否一緻。
如果不一緻,用戶端會進行信任鍊的驗證操作。
數字證書和 CA 機構
在說校驗數字證書是否可信的過程前,我們先來看看數字證書是什麼,一個數字證書通常包含了:
- 公鑰;
- 持有者資訊;
- 證書認證機構(CA)的資訊;
- CA 對這份檔案的數字簽名及使用的算法;
- 證書有效期;
- 還有一些其他額外資訊;
那數字證書的作用,是用來認證公鑰持有者的身份,以防止第三方進行冒充。說簡單些,證書就是用來告訴用戶端,該服務端是否是合法的,因為隻有證書合法,才代表服務端身份是可信的。
我們用證書來認證公鑰持有者的身份(服務端的身份),那證書又是怎麼來的?又該怎麼認證證書呢?
為了讓服務端的公鑰被大家信任,服務端的證書都是由 CA (Certificate Authority,證書認證機構)簽名的,CA 就是網絡世界裡的警察局、公證中心,具有極高的可信度,是以由它來給各個公鑰簽名,信任的一方簽發的證書,那必然證書也是被信任的。
之是以要簽名,是因為簽名的作用可以避免中間人在獲驗證書時對證書内容的篡改。
數字證書簽發和驗證流程
如下圖圖所示,為數字證書簽發和驗證流程:
CA 簽發證書的過程,如上圖左邊部分:
- 首先 CA 會把持有者的公鑰、用途、頒發者、有效時間等資訊打成一個包,然後對這些資訊進行 Hash 計算,得到一個 Hash 值;
- 然後 CA 會使用自己的私鑰将該 Hash 值加密,生成 Certificate Signature,也就是 CA 對證書做了簽名;
- 最後将 Certificate Signature 添加在檔案證書上,形成數字證書;
用戶端校驗服務端的數字證書的過程,如上圖右邊部分:
- 首先用戶端會使用同樣的 Hash 算法擷取該證書的 Hash 值 H1;
- 通常浏覽器和作業系統中內建了 CA 的公鑰資訊,浏覽器收到證書後可以使用 CA 的公鑰解密 Certificate Signature 内容,得到一個 Hash 值 H2 ;
- 最後比較 H1 和 H2,如果值相同,則為可信賴的證書,否則則認為證書不可信。
證書鍊
但事實上,證書的驗證過程中還存在一個證書信任鍊的問題,因為我們向 CA 申請的證書一般不是根證書簽發的,而是由中間證書簽發的,比如百度的證書,從下圖你可以看到,證書的層級有三級:
對于這種三級層級關系的證書的驗證過程如下:
- 用戶端收到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 都可被信任。
作業系統裡一般都會内置一些根證書,比如我的 MAC 電腦裡内置的根證書有這麼多:
這樣的一層層地驗證就構成了一條信任鍊路,整個證書信任鍊驗證流程如下圖所示:
最後一個問題,為什麼需要證書鍊這麼麻煩的流程?Root CA 為什麼不直接頒發證書,而是要搞那麼多中間層級呢?