一次加密通訊的過程
1、client_hello
客戶端發起請求,以明文傳輸請求信息,包含版本信息,加密套件候選列表,壓縮算法候選列表,隨機數,擴展字段等信息,相關信息如下:
-
支持的最高TSL協議版本version,從低到高依次 SSLv2 SSLv3 TLSv1 TLSv1.1 TLSv1.2,當前基本不再使用低于 TLSv1 的版本
-
客戶端支持的加密套件 cipher suites 列表, 每個加密套件對應前面 TLS 原理中的四個功能的組合:認證算法 Au (身份驗證)、密鑰交換算法 KeyExchange(密鑰協商)、對稱加密算法 Enc (信息加密)和信息摘要 Mac(完整性校驗)
-
支持的壓縮算法 compression methods 列表,用于后續的信息壓縮傳輸
-
隨機數 random_C,用于后續的密鑰的生成
2、server_hello+server_certificate+sever_hello_done
-
server_hello, 服務端返回協商的信息結果,包括選擇使用的協議版本 version,選擇的加密套件 cipher suite,選擇的壓縮算法 compression method、隨機數 random_S 等,其中隨機數用于后續的密鑰協商
-
server_certificates, 服務器端配置對應的證書鏈,用于身份驗證與密鑰交換
-
server_hello_done,通知客戶端 server_hello 信息發送結束
3、證書校驗
客戶端驗證證書的合法性,如果驗證通過才會進行后續通信,否則根據錯誤情況不同做出提示和操作,合法性驗證包括如下:
-
[證書鏈]的可信性 trusted certificate path
-
證書是否吊銷 revocation,有兩類方式離線 CRL 與在線 OCSP,不同的客戶端行為會不同
-
有效期 expiry date,證書是否在有效時間范圍
-
域名 domain,核查證書域名是否與當前的訪問域名匹配,匹配規則后續分析
4、client_key_exchange+change_cipher_spec+encrypted_handshake_message
-
client_key_exchange,合法性驗證通過之后,客戶端計算產生隨機數字 Pre-master,并用證書公鑰加密,發送給服務器
-
此時客戶端已經獲取全部的計算協商密鑰需要的信息:兩個明文隨機數 random_C 和 random_S 與自己計算產生的 Pre-master,計算得到協商密鑰
enc_key=Fuc(random_C, random_S, Pre-Master) -
change_cipher_spec,客戶端通知服務器后續的通信都采用協商的通信密鑰和加密算法進行加密通信
-
encrypted_handshake_message,結合之前所有通信參數的 hash 值與其它相關信息生成一段數據,采用協商密鑰 session secret 與算法進行加密,然后發送給服務器用于數據與握手驗證
5、change_cipher_spec+encrypted_handshake_message
-
服務器用私鑰解密加密的 Pre-master 數據,基于之前交換的兩個明文隨機數 random_C 和 random_S,計算得到協商密鑰:enc_key=Fuc(random_C, random_S, Pre-Master)
-
計算之前所有接收信息的 hash 值,然后解密客戶端發送的 encrypted_handshake_message,驗證數據和密鑰正確性
-
change_cipher_spec, 驗證通過之后,服務器同樣發送 change_cipher_spec 以告知客戶端后續的通信都采用協商的密鑰與算法進行加密通信
-
encrypted_handshake_message, 服務器也結合所有當前的通信參數信息生成一段數據并采用協商密鑰 session secret 與算法加密并發送到客戶端
6、握手結束
-
客戶端計算所有接收信息的 hash 值,并采用協商密鑰解密 encrypted_handshake_message,驗證服務器發送的數據和密鑰,驗證通過則握手完成
7、加密通信
-
開始使用協商密鑰與算法進行加密通信
原創文章,作者:641348038@qq.com,如若轉載,請注明出處:http://www.www58058.com/67644
圖文并茂,不錯,還可以更好,加油。