最近有同事問關(guān)于HTTPS連接建立的過程,前段時間看過不少別人的解讀,現(xiàn)在把自己的一點理解寫下來,請大家多指教交流.
首先先明確一下HTTPS使用的加密方式有兩種:
1.非對稱加密 (客戶端和服務(wù)器相互驗證過程中使用).
2.對稱加密(客戶端和服務(wù)器驗證通過之后,以隨機數(shù)作為密鑰時(真正的通信時)使用)
過程:
1.客戶端發(fā)起加密請求,叫做client hello,客戶端主要提供的信息有:
(1)客戶端可以使用的SSL/TLS版本
(2)客戶端支持的加密方式
(3)客戶端生成的隨機數(shù)(用于生成對話密鑰)
(4)服務(wù)器名稱
2.服務(wù)器收到客戶端的一系列消息后發(fā)出響應(yīng)(server hello),回應(yīng)的內(nèi)容主要包括:
(1)確認加密通信版本如果與客戶端支持的版本不一致則服務(wù)器關(guān)閉加密通信
(2)從客戶端支持的加密方式中選擇一種作為加密方式
(3)服務(wù)器生成的隨機數(shù)(用于生成對話密鑰)
(4)服務(wù)器證書(證書內(nèi)容:證書頒發(fā)機構(gòu),網(wǎng)站域名,證書公鑰,證書簽名)
除了上邊這些信息,如果服務(wù)器需要確認客戶端身份,就會再包含一項請求,要求客戶端提供客戶端證書(使用場景:服務(wù)器只允許指定的客戶端連接)
3.客戶端收到服務(wù)器響應(yīng)后首先需要驗證服務(wù)器證書:
客戶端驗證證書內(nèi)容的有效性,過期時間,域名等
由于客戶端預(yù)置了CA機構(gòu)的根證書,里面包含CA公鑰,通過本地根證書的CA公鑰,解密數(shù)字摘要,看看是否匹配
4.客戶端驗證證書沒問題然后發(fā)送下面信息:
(1)一個隨機數(shù)(pre-masterSecret)用第三步取出的公鑰加密,并發(fā)送給服務(wù)器
????此時共產(chǎn)生3組隨機數(shù),客戶端和服務(wù)器用商定的加密方法對三個隨機數(shù)進行處理生成對話需要使用的對稱密鑰也就是會話密鑰
(2)客戶端發(fā)送通知,告訴服務(wù)器將使用雙方商定的加密方法和密鑰發(fā)送
(3)客戶端發(fā)送finished消息,表示客戶端握手階段已經(jīng)結(jié)束,這個finished消息就是對上述客戶端與服務(wù)器發(fā)送所有內(nèi)容的一個hash值,并用會話密鑰進行加密蝶糯,用來驗證客戶端失敗不是剛剛建立信任的客戶端洋只。
服務(wù)器在收到客戶端發(fā)送的finished消息后,將對消息進行驗證,服務(wù)器對之前所有的消息也做一個hash,并對客戶端發(fā)送過來的消息通過會話密鑰進行解密然后將兩個消息進行對比,如果一樣則證明發(fā)送消息的客戶端是之前簡歷起信任的客戶端
5.服務(wù)器最后響應(yīng):
(1)服務(wù)器發(fā)送通知,告訴可互動將使用雙方商定的加密方法和密鑰發(fā)送
接下來就是4步驟的(3)