證書頒發機構(CA, Certificate Authority)是負責發放和管理數字證書的權威機構,並作為電子商務交易中受信任的第三方,承擔公鑰體系中公鑰的合法性檢驗的責任。
如何向 CA 申請證書
(當然不是所有的申請流程都如下所述,但原理都是一樣的)
我們需要使用一個 openssl 軟件,在這個軟件中填寫你申請所需的基本信息,如國家、公司、域名、郵箱、非對稱算法等等。讓后我們會得到兩個文本文件。(xxx表示你申請的域名)
xxx.csr
這是需要發給CA機構申請證書用的文件
xxx.key
這是服務器非對稱用的私鑰
-
.csr 文件包含什么?
該文件解碼后可以看到包含三部分信息:
- 域名基本信息
- 公鑰,和上面的私鑰是一對
- 簽名
-
解釋 簽名
簽名的過程:將1、2兩部分信息進行 sha256 散列得到 hash 值,然后通過RSA算法對hash值進行加密,密鑰為上面提到的私鑰。
簽名的作用:提供給CA校驗該csr文件的有效性。CA收到csr后,使用公鑰解密,然后也將1、2部分信息進行hash,與解密的數據對比,相同則說明數據沒有被篡改過。
-
為什么要先hash再加密,直接加密不行嗎?
hash是一種摘要算法,元數據可能很大,直接對非常大的數據加密效率太低,密文也會很大,因此先對要加密的數據進行hash獲取它的摘要信息,有效性是一樣的。
-
CA 收到申請者的CSR文件后,進行審核,通過后就會下發證書文件。
證書文件
發回的證書可能包含兩個文件:
-
申請域名的證書
-
證書鏈(包含多個節點,每個節點都是一份證書)
通常是.pem或.crt后綴的文本文件。
每個證書的內容主要也包含三部分:
- 基本信息,如證書頒發機構、有效期、證書申請信息
- 公鑰,即服務器非對稱用的公鑰
- 簽名,對上面部分進行hash再用 CA 的私鑰加密簽名(也是用於客戶端驗證證書的有效性)
客戶端如何驗證證書?
通常一個證書鏈有多個證書節點,這里我們拿有3個節點的鏈舉例:
- DST Root CA X3 根證書節點
- Let's Encrypt Authority X3 中間證書節點
- xxx.com 申請者自己的證書
- Let's Encrypt Authority X3 中間證書節點
證書鏈是環環相扣,由根節點簽發中間節點,中間節點簽發域名證書。
- 驗證流程:
- 客戶端訪問 xxx.com 時,服務器會返回證書鏈;
- 客戶端首先判斷 xxx.com 證書是否可信,主要是通過驗證簽名,這里就需要加密這個證書的公鑰。即中間節點的CA公鑰。
- 因此去中間節點尋找公鑰,中間節點證書第二部分就是CA的公鑰,但我們還不能保證中間節點證書的有效性,因此還需先對中間節點進行簽名驗證,這時就需要去根節點找公鑰。
- 根節點CA包括一些非常權威的CA機構,他們的證書庫通常被內置在操作系統中或瀏覽器中。我們找到根節點的CA公鑰,然后一步步回去驗證下面節點的有效性。都驗證通過了,則該證書有效。客戶端獲得了服務器的公鑰可以進行非對稱加密了。
HTTPS通信大致過程
- 建立tcp連接
- 開始TSL握手
- client hello
- server hello
- server發送證書、非對稱公鑰
- client回傳PreMaster Key
- 生成對稱加密密鑰Master Key,結束
- 開始對稱加密傳輸
具體流程可看我的博客《抓包觀察TSL1.2握手過程》