通過使用Wireshark抓包分析TLS握手的過程,可以更容易理解和驗證TLS協議,本文將先介紹Wireshark解密HTTPS流量的方法,然后分別驗證TLS握手過程和TLS會話恢復的過程。
一、使用Wireshark解密HTTPS流量的方法
TLS對傳輸數據進行了加密,直接使用Wireshark查看,TLS協議之上的協議細節(應用層 HTTP)完全看不到,因此需要解密后,才能查看。解密方法如下:
1.在Wireshark官網下載系統對應的Wireshark安裝包,進行安裝
2.增加系統環境變量設置(計算機 -- 右鍵 -- 屬性--高級系統設置--高級--環境變量--系統變量--新建)
變量名:SSLKEYLOGFILE
變量值:%USERPROFILE%\sslkeysENV.pms
3.在CMD使用命令行啟動chrome瀏覽器
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --ssl-key-log-file=%USERPROFILE%\sslkeysARG.pms
4.設置Wireshark
(1)打開Wireshark--編輯--首選項--Protocols--SSL
(2)設置(Pre)-Master-Secret log filename
C:\Users\用戶名\sslkeysARG.pms (路徑 就是 %USERPROFILE%的值)
(3)設置SSL debug file (此步驟可選,用來記錄解密的日志)
C:\Users\用戶名\ssl.log (路徑 就是 %USERPROFILE%的值)
5.此時便可以在Wireshark中查看HTTPS的流量了
下面是解密前后對比圖:
二、完整的TLS握手過程
上圖是完整的TLS握手的過程,TLS運行在傳輸層協議之上,藍色的部分是TCP握手階段。假設服務器與客戶端的傳輸時間是28ms。我們通過Wireshark的抓包來逐條分析:
1. 在0ms,客戶端發送SYN分組開始TCP握手;
2. 在28ms,服務器響應SYN-ACK分組;
3.在56ms,客戶端確認SYN-ACK;
同時,立即發送Client Hello,也是TLS握手的第一步,將TLS的版本、所支持的加密套件列表、支持或希望的使用的TLS擴展選項發送給服務器。
其中server_name 為SNI(Server Name Indication,服務器名稱指示)擴展,與HTTP中Host首部相似,在握手之初就指定要連接的主機名。對於相同IP服務不同域名的情況,就可以使用SNI區分不同的域名。
其中Application Layer Protocol Negotiation 為ALPN應用層協議協商擴展,在TLS握手的同時協商應用協議,節省HTTP Upgrade機制帶來的額外的往返時間。
4. 在84ms,服務器發送Server Hello,Certificate,(Server Key Exchange),Server Hello Done
服務器取得TLS協議版本用於之后的通信,從客戶端提供的加密套件里選擇一個,選擇HTTP協議版本,附上自己的證書,發送給客戶端。作為可選項,服務器也可以發送一個請求,要求客戶端提供證書及其他TLS擴展參數。
5. 在112ms,客戶端發送Client Key Exchange,Change Cipher Spec,Finished
客戶端生成一個新的對稱密鑰,用服務器的公鑰加密,發送給服務器,告知服務器可以開始加密通信了。
6. 在140ms,服務器端發送(New Session Ticket),Change Cipher Spec,Finished
服務器解密出客戶端發來的對稱密鑰,通過驗證消息的MAC檢查消息的完整性,再返回給客戶端一個加密的“Finished”消息。因為是第一次建立會話,還發送了New Session Ticket。
7. 在168ms,開始傳輸應用層數據。
三、簡短的TLS握手過程
為了節省握手往返次數,TLS提供了恢復功能,通過服務器端的會話標識符或客戶端的會話記錄單機制,也被稱為會話緩存或無狀態恢復機制,減少協商次數。
1. 在0ms,客戶端發送SYN分組開始TCP握手;
2. 在28ms,服務器響應SYN-ACK分組;
3.在56ms,客戶端確認SYN-ACK;
同時,立即發送Client Hello,也是TLS握手的第一步,將TLS的版本、Session ID、所支持的加密套件列表、支持或希望的使用的TLS擴展選項發送給服務器。
4. 在84ms,服務器發送Server Hello,Change Cipher Spec,Server Hello Done
5. 在112ms,客戶端發送Change Cipher Spec,Finished
同時,立即可以傳輸應用層數據。
參考資料: