握手流程
客戶端發(fā)起https請求
客戶端告訴服務(wù)端支持哪些加密算法。-
服務(wù)端響應(yīng)
- 選擇合適的加密算法(比如:RSA、AES、MD5);
- 將
CA證書數(shù)字簽名和服務(wù)端公鑰返回給瀏覽器。
-
客戶端驗證服務(wù)端數(shù)字簽名,發(fā)送秘鑰給服務(wù)端
- 驗證服務(wù)端返回的
數(shù)字簽名; - 生成一個隨機(jī)數(shù)
a,作為AES加密秘鑰,使用服務(wù)端公鑰對a加密,得到b; - 生成握手消息,以
a為秘鑰對其進(jìn)行AES加密,得到c; - 計算握手消息的HASH值,得到
d; - 將
b、c和d發(fā)送到服務(wù)端。
- 驗證服務(wù)端返回的
-
服務(wù)端確認(rèn)加密秘鑰
- 使用
服務(wù)端私鑰解密b,得到a; - 以
a為秘鑰對c進(jìn)行AES解密,得到握手消息; - 計算握手消息的HASH,驗證其與
d是否一致; - 生成新的握手消息,以
a為秘鑰對其進(jìn)行AES加密,得到e; - 計算新握手消息的HASH值,得到
f; - 將
e和f返回給瀏覽器。
- 使用
-
握手過程完成,客戶端發(fā)送加密數(shù)據(jù)給服務(wù)端
- 以
a為秘鑰對e進(jìn)行AES解密,得到新握手消息; - 計算新握手消息的HASH,驗證其與
f是否一致; - 至此,握手過程結(jié)束。之后所有的通信數(shù)據(jù)將以
a為秘鑰進(jìn)行AES加密后傳輸。
- 以
客戶端驗證服務(wù)端數(shù)字簽名的流程
獲取對應(yīng)CA證書頒發(fā)機(jī)構(gòu)的公鑰
根據(jù)數(shù)字簽名信息,獲取對應(yīng)CA證書頒發(fā)機(jī)構(gòu)的公鑰。
該公鑰是被根證書頒發(fā)機(jī)構(gòu),使用其私鑰加密過的。解密并獲得CA證書頒發(fā)機(jī)構(gòu)的公鑰
使用本地根證書公鑰,解密并獲得CA證書頒發(fā)機(jī)構(gòu)的公鑰。
本地根證書公鑰是在用戶安裝操作系統(tǒng)時,由操作系統(tǒng)寫入瀏覽器的。解密數(shù)字簽名,驗證服務(wù)端公鑰
使用CA證書頒發(fā)機(jī)構(gòu)的公鑰,解密數(shù)字簽名,得到服務(wù)端公鑰的HASH。
計算服務(wù)端公鑰的HASH,驗證二者是否相同。