基於wireshark抓包的分析
首先使用wireshark並且打開瀏覽器,打開百度(百度使用的是HTTPS加密),隨意輸入關鍵詞瀏覽。
我這里將抓到的包進行過濾。過濾規則如下
ip.addr == 115.239.210.27 && ssl
- 1
下面用圖來描述一下上面抓包所看到的流程。
1. Client Hello
打開抓包的詳細,如下。
不難看出,這一握手過程,客戶端以明文形式傳輸了如下信息:
- 版本信息(TLS 1.2)
- 隨機數
- Session ID(用於加快握手過程,可參考TLS會話復用)
- 加密套
- 壓縮算法
- 其它一些擴展的(Extension),比如簽名算法,服務器名稱(本例為sp1.baidu.com);
Server hello
這一階段,服務端返回所選擇的協議版本(Version),加密套,壓縮算法,隨機數,Session ID等;
from:https://blog.csdn.net/u010536377/article/details/78989931
數據傳輸
經過了 SSL 握手后,服務端的身份認證成功,協商出了加密算法為 AES,密鑰為 xxxxx(客戶端和服務端拿三個隨機值用相同算法計算出來的,並沒有明文傳輸)。一切准備就緒。
SSL 握手成功,已經可以對接下來的數據加密了,接下來各種應用層協議都可以加密傳輸。
Application Data
應用數據傳輸消息。因為這里是 HTTPS,所以可以對 HTTP 應用協議數據加密然后傳輸了。
Secure Sockets Layer TLSv1.2 Record Layer: Application Data Protocol: http Content Type: Application Data (23) Version: TLS 1.2 (0x0303) Length: 1072 Encrypted Application Data: 6d9b3c9089271630c33506fe28cd6a61fed1f4bd2808f537...
從這里,不知道密鑰是無法知道這里傳輸的是什么數據,連傳輸的是什么協議的內容都不知道。
所以之前創建 SSL 隧道,讓代理服務器盲傳 HTTPS 數據,就得通過 CONNECT 方法告訴代理服務器要連哪台主機,哪個端口號,要不然代理服務器也是一臉懵逼。
所以 SSL 協議是很獨立的,這里是對 HTTP 進行了加密,也可以對其他協議進行加密。它就像是 TCP 和應用層協議的中間層,為上層協議提供了加密的數據傳輸。
Encryted Alert
SSL 警告消息,因為是加密的內容,所以單從 Wireshark 看不出警報的內容。
Secure Sockets Layer TLSv1.2 Record Layer: Encrypted Alert Content Type: Alert (21) Version: TLS 1.2 (0x0303) Length: 48 Alert Message: Encrypted Alert
但因為警報消息經常只是客戶端用來提示服務端 SSL 傳輸結束,對照抓包到的內容確實如此。所以這里只是 SSL 傳輸結束的一個信號。
發出了 Encryted Alert 后客戶端數據傳輸完畢,准備進入四次揮手斷開 TCP 連接。
from:https://www.jianshu.com/p/cf8c2f2cd18a
為什么Wireshark無法解密HTTPS數據
密鑰交換算法目前常用的有RSA和Diffie-Hellman。
對於密鑰交換使用RSA算法,pre-master-secret由客戶端生成,並使用公鑰加密傳輸給服務器。
對於密鑰交換使用Diffie-Hellman算法,pre-master-secret則通過在Key Exchange階段交換的信息,由各自計算出pre-master-secret。所以pre-master-secret沒有存到硬盤,也沒有在網絡上傳輸,wireshark就無法獲取session key,也就無法解密應用數據。那我們是否可以反向計算出pre-master-secret呢?理論上可以,但是非常困難。
對Diffie-Hellman算法感興趣的可以參考https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange
說了這么多,究竟有什么辦法可以讓wireshark解密數據?我們可以通過下面幾種方法來使wireshark能解密https數據包。
1. 中間人攻擊;
2. 設置web服務器使用RSA作為交換密鑰算法;
3. 如果是用chrome,firefox,可以設置導出pre-master-secret log,然后wireshark設置pre-master-secret log路徑,這樣就可以解密了。