【轉載】HTTPS報文抓包

HTTPS簡單來說,就是使用SSL對HTTP報文進行加密傳輸。
SSL(Secure Sockets Layer 安全套接層),及其繼任者傳輸層安全(Transport Layer Security,TLS)是爲網絡通信提供安全及數據完整性的一種安全協議。TLS與SSL在傳輸層對網絡連接進行加密。
 

一、密文解析方法:

HTTPS報文本身是加密的,wireshark也無法解析。因此需要將HTTPS生成的隨機數(premaster-secret)提供給wireshark,wireshark才能正確解讀密文。
具體配置方法(WINDOWS):

建立path變量 SSLKEYLOGFILE=c:\ssl.key
重啓firefox/chrome,訪問https網站會自動生成ssl session key
在wireshark中配置:編輯-首選項-Protocol-SSL-(Pre)-Master-Secret log filename 設置爲之前配置的ssl.key文件,即可解密抓到的SSL密文
 

二、準備過程(DNS、TCP與302跳轉):

在電腦瀏覽器輸入www.baidu.com,此時請求的是HTTP報文。

2.1 DNS解析:獲得baidu網站IP地址

2.2 TCP建立連接:HTTP服務基於TCP連接,根據前述DNS解析結果建立連接。

2.3 HTTP請求與響應:可見,服務器響應了一個302 Moved Temporarily 重定向報文,定向到 https://www.baidu.com,接下來進入HTTPS報文請求環節。

 

三、SSL/TLS報文交互(即HTTPS如何通過非對稱算法得到一個對稱密鑰用於加密)

 

注:此處發生了一次亂序,導致了一次SACK確認,181與180行的先後順序顛倒了。

下圖爲TLS/SSL報文交互流程示意圖。

 

      Client                                               Server

         ClientHello
        (empty SessionTicket extension)-------->
                                                         ServerHello
                                     (empty SessionTicket extension)
                                                        Certificate*
                                                  ServerKeyExchange*
                                                 CertificateRequest*
                                      <--------      ServerHelloDone
         Certificate*
         ClientKeyExchange
         CertificateVerify*
         [ChangeCipherSpec]
         Finished                     -------->
                                                    NewSessionTicket
                                                  [ChangeCipherSpec]
                                      <--------             Finished
         Application Data             <------->     Application Data

其中ServerKeyExchange爲DH算法專有(RSA算法則無)



175報文:用戶端發起Client Hello,攜帶版本信息與random數(客戶端),並在Cipher Suites中提供了所有可用的加密協議。
由於之前未建立過連接,攜帶length爲0的Session id,表明期待一個SessionTicket


179,181報文:服務器端答覆Server Hello,選定加密協議(本次抓包爲ECDH),並傳遞自己的certificate給客戶端。

以baidu爲例:其證書中最重要的兩部分內容就是公鑰與數字簽名。其中數字簽名,即確保該certificate爲真百度網站所提供的證書。公鑰,則用於與百度網址進行RSA不對稱算法的數據交互,生成可靠密鑰。

 


180: 服務器端發送Server Key Exchange與Server Hello Done

Server Key Exchange發送了DH算法中的Kb值,並使用RSA簽名方式進行了簽名確保身份。(如果使用RSA則無此報文)。
Server Hello Done則表明Server端的報文已結束。

 

至此,Server已經提供了證書、公鑰、Kb,併發送Hello Done進行確認。如果Server端需要驗證Client端的身份,則需在發送Hello Done前發起Certificate Request,Client端就會類似Server端一樣,發送證書以及Client公鑰(一般Client端的證書與公鑰主要通過U盾模式提供,用於安全要求較高的網銀等場景)。

 

184:客戶端答覆Client key Exchange,Change Cipher Spec Protocol,Finished

 

Client Exchange即DH算法中的Kb(由於不驗證Client端身份,所以Client不需要傳遞Signature)。
Change Cipher Spec代表Client已經完成了全部協商,接下來的數據包將使用TLS進行封裝傳輸。
Finished:最後發送finish報文表示結束。

 

------至此雙方已經交互了所有的DH算法所需的參數,均可計算得出對稱密鑰s。------

187:服務器端答覆New Session Ticket,Change Cipher Spec Protocol,Finished

Session Ticket用於TLS中斷後重新接續Session
Change Cipher Spec 代表Server端告知Client接下來的報文將使用TLS加密進行傳輸
Finished表示TLS連接建立過程結束

四、HTTPS報文傳輸

在發送Change Cipher Spec與Finished報文後,客戶端即向服務器端發送加密的HTTP over TLS 報文;
服務器端在發送Change Cipher Spec與Finished報文後,同樣使用HTTP over TLS應答HTTP 200 OK報文。

使用前述抓包方法可以在wireshark中解開加密的字符串,看到其中的密文:HTTP 200 OK響應報文

注:wireshark用於解密HTTPS報文的本地key,應該是指本地生成的隨機數(RSA中的premaster隨機數或DH中的a隨機數),而非RSA公鑰/私鑰

 



相關參考RFC:
RFC5246:The Transport Layer Security (TLS) Protocol Version 1.2
RFC2818:HTTP over TLS
RFC3526:More Modular Exponential (MODP) Diffie-Hellman groups for Internet Key Exchange (IKE)
RFC5077:Transport Layer Security (TLS) Session Resumption without Server-Side State

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章