本博客是對下面博客鏈接上的原文進行梳理+本身在其餘方面資料作個整理html
一個正常的TLS1.3 握手順序是按照下面的順序進行:ios
TLS1.3最大的特色就是對不一樣的報文使用多種不一樣的祕鑰,TLS1.2中只使用兩種祕鑰,一個事用於完整性校驗,另外一個是用於報文加密,同一個鏈接中不一樣方向的加密祕鑰不同,TLS1.3使用AEAD機制再也不使用MAC_key來進行完整性校驗,同時因爲其餘各類用途的加密須要,TLS1.3的實施過程使用一下幾種key:算法
handshake_key early_traffic_key resumption_key exporter_key(導出祕鑰,用戶自定義的其餘用途)安全
這些祕鑰都是由以前協商的祕鑰材料計算而出,區別在於HKDF的計算次數不一樣,HKDF計算使用的哈希值不一樣,以會話祕鑰application_key爲例子,以整個握手階段的報文做爲輸入,計算四次HKDF導出最終使用的祕鑰,同時,當加密的報文長度達到必定的長度的時候,雙方發送的KU報文從新計算application_key服務器
數據發送出去以後,recod層會在密報文頭部加上一小段的明文信息來標識解密後明文的長度信息,對方的讓recod 層收到消息以後,經過逆過程解密密文後轉發給上層協議,網絡
同時TLS1.3協議版本容許在末尾添加八字節整數倍的全爲0的二進制數據,對方收到該消息以後,解密從末尾開始去掉0 ,當搜索到第一個不全爲0的八字節的時候結束。session
總的歸納: TLS1.3協議版本 使用的更加 複雜額祕鑰導出過程,加強了最終使用祕鑰的安全性,同時簡化了所使用的加密祕鑰,刪除了RC4 3DES SHA1 AES-CBC 等加密算法,刪除了加密前壓縮,從新協商等具備的漏洞,精簡了協議 內容,併發
在TLS1.2中記錄協議record,佔據一個TLS鏈接的絕大數的數據流量,app
下面對TLS協議祕鑰協商的過程的分析 dom
基於RSA握手和祕鑰交換的客戶端驗證服務器爲示例以下
下面是上網的握手過程的時序圖
下面對上面的協商過程解釋:
(1)Client-Hello 客戶端發送請求,以明文傳輸信息,包含版本信息,加密候選列表,候選算法列表,隨機數,擴展字段等信息,
客戶端支持加密套件 cipher suite列表,注意,每個加密條件對應前面TLS原理中的四個功能的組合,認證算法Au(身份驗證),祕鑰交換算法 (keyExchange 祕鑰協商),對稱加密算法Enc(信息加密),信息摘要MAc(完整性驗證)。在TLS1.2 中支持壓縮算法,Client-Hello 中包含壓縮算法列表,用於後後續的壓縮階段使用。另外還有隨機數 randmo_c 用於後續祕鑰的生成。最後還包括擴展字段 extension 支持協議相關算法的參數以及其餘輔助信息。
(2)Server-Hello +Server_cerficate+ server_hello_done
server_hello 服務端返回協商的信息結果,包括使用的協議版本,選擇的加密套件,以及使用的壓縮算法 隨機數(隨機數用於後續的祕鑰協商)
server_certificate 服務器端配置對應的證書鏈,用於身份驗證和祕鑰交換
server_Hellodone 通知客戶端 server_hello 信息發送結束
(3)證書校驗
客戶端證書的合法性,若是驗證經過纔會進行後續的通訊,合法性驗證主要包括下面的環節:
證書鏈的可信任、證書是否吊銷、證書是否在有效期內、域名,覈實證書的域名是不是當前訪問的域名相匹配。
(4)Client_key_excahage+ change_chiper_spec+encrypted_handshake_message
client_key_exchage 合法性驗證經過以後,客戶端計算產生隨機數 pre-master ,並用證書的Pk 加密發送給服務器。
當客戶端獲取所有的計算協商祕鑰須要的信息: 兩個明文隨機數 Radmon_c 和 Radmon-S 和本身計算產生的 pre-master 計算獲得協商祕鑰
enc_key=fuc(randmo_C,randmo_s,pre-Master)
change_chiper_spec,客戶端通知服務器後續的通訊都採用協商的通訊加密祕鑰和加密算法進行加密通訊,
encrypted_handshake_message 結合前面全部的通訊參數的hash值和其相關的信生成一段數據,採用協商的 session-secret 與算法進行加密以後發送給服務器用於數據與握手驗證
5)Change_ciper_spec +encrypted_handshake_message
服務器使用私鑰解密加密的per-master 數據,基於以前交換的兩個明文隨機書卷 Random_c 和 random_S 計算協商祕鑰 enc_key=fuc(randmo_C,randmo_s,pre-Master)
計算以前所接受信息的hash 值,而後解密客戶端發送 encrypted_handshake_message 驗證數據和祕鑰的正確性
encrypted_handshake_message驗證完以後,服務器結一樣發送 change_cipher_spec以告知客戶端後續的通訊採用協商祕鑰與算法加密通訊
encrypted_handshake_message服務器結合當前全部的通訊參數生成一段數據並採用協商祕鑰 session secret 與算法加密併發到客戶端
(6)結束握手
客戶端計算全部接受到的信息的hash值,並採用協商祕鑰解密 encrypted_handshake_message 驗證服務器發送的數據和祕鑰,驗證經過則完成握手。
(7)加密通訊
開始使用協商祕鑰與算法進行加密通訊
對TLS協議進行形式化分析的思惟導圖
下面是對 論文形式化工具Scyther 優化實例分析的關於 TSL的整理
做者對TLS的形式化過程當中的涉及到如何將角色模型轉化成安全模型的並無說明, 只是將TSL.spdl執行的結果 截圖,而後說明TLS是存在安全隱患的,分別在強安全模型和DY模型下面進行了低手的攻擊測試
另外, 做者對攻擊的軌跡路徑沒有說明。對存在的多種的軌跡路徑只是截了一張圖來簡單的說明 確實存在安全的問題
握手第一步是客戶端向服務端發送 Client Hello 消息,這個消息裏包含了一個客戶端生成的隨機數 Random一、客戶端支持的加密套件(Support Ciphers)和 SSL Version 等信息。經過 Wireshark 抓包,咱們能夠看到以下信息:
Wireshark 抓包的用法能夠參考這篇文章
第二步是服務端向客戶端發送 Server Hello 消息,這個消息會從 Client Hello 傳過來的 Support Ciphers 裏肯定一份加密套件,這個套件決定了後續加密和生成摘要時具體使用哪些算法,另外還會生成一份隨機數 Random2。注意,至此客戶端和服務端都擁有了兩個隨機數(Random1+ Random2),這兩個隨機數會在後續生成對稱祕鑰時用到。
這一步是服務端將本身的證書下發給客戶端,讓客戶端驗證本身的身份,客戶端驗證經過後取出證書中的公鑰。
若是是DH算法,這裏發送服務器使用的DH參數。RSA算法不須要這一步。
Certificate Request 是服務端要求客戶端上報證書,這一步是可選的,對於安全性要求高的場景會用到。
Server Hello Done 通知客戶端 Server Hello 過程結束。
客戶端收到服務端傳來的證書後,先從 CA 驗證該證書的合法性,驗證經過後取出證書中的服務端公鑰,再生成一個隨機數 Random3,再用服務端公鑰非對稱加密 Random3生成 PreMaster Key。
上面客戶端根據服務器傳來的公鑰生成了 PreMaster Key,Client Key Exchange 就是將這個 key 傳給服務端,服務端再用本身的私鑰解出這個 PreMaster Key 獲得客戶端生成的 Random3。至此,客戶端和服務端都擁有 Random1 + Random2 + Random3,兩邊再根據一樣的算法就能夠生成一份祕鑰,握手結束後的應用層數據都是使用這個祕鑰進行對稱加密。爲何要使用三個隨機數呢?這是由於 SSL/TLS 握手過程的數據都是明文傳輸的,而且多個隨機數種子來生成祕鑰不容易被暴力破解出來。客戶端將 PreMaster Key 傳給服務端的過程以下圖所示:
這一步是客戶端通知服務端後面再發送的消息都會使用前面協商出來的祕鑰加密了,是一條事件消息。
這一步對應的是 Client Finish 消息,客戶端將前面的握手消息生成摘要再用協商好的祕鑰加密,這是客戶端發出的第一條加密消息。服務端接收後會用祕鑰解密,能解出來講明前面協商出來的祕鑰是一致的。
這一步是服務端通知客戶端後面再發送的消息都會使用加密,也是一條事件消息。
這一步對應的是 Server Finish 消息,服務端也會將握手過程的消息生成摘要再用祕鑰加密,這是服務端發出的第一條加密消息。客戶端接收後會用祕鑰解密,能解出來講明協商的祕鑰是一致的。
到這裏,雙方已安全地協商出了同一份祕鑰,全部的應用層數據都會用這個祕鑰加密後再經過 TCP 進行可靠傳輸。
前面提到 Certificate Request 是可選的,下面這張圖展現了雙向驗證的過程:
若是每次重連都要從新握手仍是比較耗時的,因此能夠對握手過程進行優化。從下圖裏咱們看到 Client Hello 消息裏還附帶了上一次的 Session ID,服務端接收到這個 Session ID 後若是能複用就再也不進行後續的握手過程。
除了上述的 Session 複用,SSL/TLS 握手還有一些優化技術,例如 False Start、Session Ticket 等
參考文獻: