整體互動圖和資料包截圖如上。具體分步驟解析如下:
1、client hello:客戶端傳送client hello,包含自己支援的TLS版本(伺服器從中選擇好版本後,客戶端不需要再次回覆自己也同意,預設就是同意了,不需要顯示地回覆)、隨機數(一會用來計算對稱金鑰用的)、密碼套件(非對稱演算法使用什麼、對稱演算法用什麼、驗證資料完整性的演算法用什麼);
2、server hello+server certificate+server hello done:伺服器回覆。這三個內容通常合併為一個資料包來傳送。
1)伺服器回覆server hello,包含自己選擇的TLS版本(通常為client hello支援的TLS版本中,最高的那個,如果自己也支援,就選擇最高的,否則會從版本列表中找次高的,看自己是否支援。如果都沒有,就回復 一個protocol_version警告給客戶端,這個警告包含不支援的TLS版本號,以及自己支援的版本。如果還是兩邊無法協商出來,握手就會失敗)、隨機數、會話ID、選擇的密碼套件等;
2)server certificate:伺服器傳送自己的數字證書,其中,包含伺服器的RSA公鑰,RSA演算法是剛剛選擇的非對稱演算法。傳送這個證書還有個重要作用,就是證明自己的身份是合法的,因為裡面還包含伺服器自己的域名或者組織資訊,客戶端可以拿去驗證伺服器證書的真實性和合法性,建立信任鏈條;
3) server hello done:完成hello;
3、client key exchange+change cipher spec+encrypted handshake message:客戶端傳送。這三個內容通常是合併在一個報文中的。
1)client key exchange:告訴伺服器,我使用的預主密碼是什麼;
2)change cipher spec:我已經使用此預主金鑰和我hello報文中的客戶端隨機數,你hello報文中的隨機數,透過偽隨機函式(PRF),生成了對稱金鑰,這也是以後咱們會話的會話金鑰,從現在開始,後續會話就進入加密狀態了;
3)encrypted handshake message:使用會話金鑰加密的“Finished”訊息;
4、change cipher spec+encrypted handshake message:伺服器回覆。這兩個內容通常是合併在一個報文中的。
1)change cipher spec:我已經使用你給我的預主金鑰,和我hello報文中的客戶端隨機數,你hello報文中的隨機數,透過偽隨機函式(PRF),生成了對稱金鑰,這也是以後咱們會話的會話金鑰,從現在開始,後續會話就進入加密狀態了;
2)encrypted handshake message:使用會話金鑰加密的“Finished”訊息。
5、握手完成。後續使用剛剛生成的會話金鑰,對後續會話進行加密,這是一個對稱加密的過程,即從第10個報文開始,就是真正的會話過程了。
【FAQ】
1、HTTPS 對稱、非對稱發生在哪裡?
TLS握手過程,使用非對稱加密(可以選擇RSA、ECDHE等非對稱演算法)來安全地協商一個對稱金鑰(可以選擇AES、DES、3DES等對稱演算法),然後在後續的資料傳輸中使用該對稱金鑰進行加密。
2、HTTPS 握手時,伺服器必須從客戶端的client hello已有的cipher suites選擇套件,不能自己隨意拼配麼?
在TLS(Transport Layer Security)協議中,伺服器確實需要從客戶端傳送的支援的cipher suites列表中進行選擇,而不是隨意拼配。選擇時,會考慮安全性、效能、相容性。
3、client hello裡面的session id作用
主要是用於幫助伺服器和客戶端,管理和複用之前建立的會話。1)會話複用;2)快速恢復;3)安全性(Session ID本身並不涉及加密或安全性,但透過有效地管理會話狀態,可以提高安全性,例如減少頻繁地執行金鑰交換可能帶來的風險)。
4、密碼套件中,還有SHA,MD5是幹嘛用的?
主要用來做完整性校驗用的,保證發的東西沒有被改過。
5、後續會話中,每次要傳送資料前,都要發一次change cipher spec麼?
傳送資料之前並不需要每次傳送一次ChangeCipherSpec訊息。ChangeCipherSpec訊息是TLS握手過程中的一部分,用於通知對方從未加密狀態切換到加密狀態。以下三種情況,會出現多個changecipherspec的情況:1)當出現會話重協商加密引數或者更新會話金鑰;2)tls 1.3有一個early data(0-RTT)功能,允許第一次握手就傳送加密資料,這種時候伺服器也可能收到多個changecipherspec;3)有些錯誤場景也會引發多個changecipherspec。一些TLS實現可能會實施防護措施,限制changecipherspec的次數。