1. 程式人生 > >Wireshark解密HTTPS流量的兩種方法

Wireshark解密HTTPS流量的兩種方法

原理

  我們先回顧一下SSL/TLS的整個握手過程:

  • Clienthello:傳送客戶端的功能和首選項給伺服器,在連線建立後,當希望重協商、或者響應伺服器的重協商請求時會發送。
    • version:客戶端支援的最佳協議版本
    • Random:共32位元組,28位元組隨機數,4位元組額外資訊,受客戶端時鐘影響(為了避免瀏覽器指紋採集,現在一般會對4位元組時鐘做扭曲)
    • Session ID:32位元組隨機數,用於和伺服器重建會話,為空表示新建會話
    • cipher suit:客戶端支援的所有密碼套件,按優先順序排列
    • Compression:客戶端支援的壓縮演算法,預設無壓縮
    • Extensions:由任意數量的擴充套件組成,攜帶額外資料
  • ServerHello:
    • 選擇客戶端提供的引數反饋客戶端
    • 伺服器無需支援客戶端支援的最佳版本,如果伺服器不支援客戶端版本,可以提供其他版本以期待客戶端可以接受
  • Certificate:
    • 用於攜帶伺服器X.509證書鏈
    • 主證書必須第一個傳送,中間證書按照正確的順序跟在主證書之後
    • 伺服器必須保證傳送的證書和選擇的演算法套件一致
    • Certificate訊息時可選的
  • ServerKeyExchange: 攜帶金鑰交換的額外資料,取決於加密套件
  • ServerHelloDone:伺服器已將所有預計的握手訊息傳送完畢
  • ClientkeyExchange:攜帶客戶端為金鑰交換提供的資訊
  • ChangeCipherSpec:傳送端已取得用以連線引數的足夠的資訊
  • Finish:握手完成,訊息內容加密,雙方可以交換驗證,整個握手完整性所需的資料
    • 演算法:verrify_data = PRF(master_secret , finished_label,hash(handshake_message))

  要解密HTTPS流量,需要得到加密金鑰,加密金鑰由主金鑰、客戶端隨機數、伺服器隨機數生成。由上述握手過程可知,客戶端隨機數和伺服器隨機數在雙方握手訊息中傳遞,而主金鑰(master_secret)則由預主金鑰(pre_master_secret)結合兩個隨機數生成。預主金鑰通過密碼套件中的金鑰交換演算法進行交換(DH、RSA)。

  因此,通過Wireshark解密HTTPS,可以從兩個地方下手:1、金鑰交換演算法選擇RSA,然後提取伺服器的私鑰,將私鑰匯入Wireshark,通過Wireshark解密金鑰交換過程中傳遞的預主金鑰,再結合之前的客戶端和伺服器隨機數生成主金鑰,進一步生成加密金鑰,即可解密後續抓取到的加密報文。2、直接從客戶端提取預主金鑰,結合客戶端和伺服器隨機數生成加密金鑰,實現對加密報文的解密。

  下面演示兩種方法解密HTTPS流量。

方法一

  從伺服器上匯出帶私鑰的P12格式的證書,或者直接匯出伺服器的私鑰。

  捕獲從TCP三次握手開始的完整報文:

       

 

   可以看到此時的報文是被TLS加密的,無法看到具體的報文內容。

  點選編輯——>首選項——>協議——>SSL(有的版本只有TLS),匯入RSA key:

  

  由於通過DH方法交換的金鑰不會在中間傳遞,所以這種方法只能解密通過RSA交換的金鑰。

 

  匯入伺服器證書:

  

 

  點選ok後,Wireshark會對捕獲的報文進行解密:

  

  報文被成功解密,可以直觀的看到HTTP報文的請求和響應。

 

第二種

  通過設定環境變數擷取瀏覽器的pre_master_secret,進而實現解密HTTPS的目的。

  環境變數中新建使用者變數SSLKEYLOGFILE=路徑\sslkey.log檔案,之後再wireshark中ssl配置中制定該檔案位置即可。

  

  點選編輯>首選項>protocol>ssl:

  

  即可解密瀏覽器的訪問流量:

  

&n