原文地址:http://kelvinh.github.io/blog/2014/01/12/decrypt-ssl-using-fiddler-and-wireshark/
Fiddler是一個著名的調試代理工具,它不僅能解析HTTP,而且還能解析加密的HTTPS流量。Wireshark則是一個非常強大的網絡包監控以及協議分析工具。 在本文中,只考慮使用SSL來加密HTTP,所以並不嚴格區分SSL和HTTPS,雖然從廣義上來講,將二者混為一談是非常不合理的 。
看到這里,大多數人都會很困惑:Fiddler不就能解密SSL流量嗎?為什么還需要Wireshark呢?
是的,在大多數情況下,用Fiddler來解密SSL已經足夠了,但在實際使用過程中,我們發現Fiddler在解決HTTP長連接時無能為力。對於特定的應用,比方說Office365的Microsoft MAPI over HTTP,它總是在Outlook和Office365 Exchange server之間維護一個HTTP長連接,並且利用HTTP chunk的特性,在有更新時返回一個chunk來達到實時將server端的變化告知給Outlook的目的。但是Fiddler不能很好地handle這種情況,它總是期望在HTTP response全部返回之后再顯示出來。所以,在上述應用中,Fiddler不僅不能實時顯示HTTP通信中的內容,而且,即使一個長連接斷開之后,它顯示的HTTP response也是無效的內容。
所以,我們就想到了Wireshark,它總是能實時監控網絡流量。可是我們要監控的HTTP流量是經過SSL加密的,所以它必須要加密SSL流量的private key,才能解密這個SSL流量。因此,直接攔截網絡流量是行不通的,因為server端的private key我們無法拿到。
於是,這兩種情況綜合一下,就促成了我們的解決方案:將Fiddler作為SSL代理以提供private key,然后用Wireshark實時監控以解密流量。
SSL介紹及SSL代理原理
SSL(Secure Socket Layer)是Netscape公司設計用來加密Internet通信流量的,最新版本更名為TLS(Transport Layer Security)。它采用X509證書加密來保證通信的保密性和可靠性。加密采用的證書通常由第三方證書頒發機構頒發,而這些機構是被信任的,也就是說,它們不會利用這些頒發的證書來進行竊聽等行為。基於此前提,SSL協議本身能夠保證:如果發生了竊聽,那么用來加密的證書必定是不受信任的(除非用戶將這些證書添加到其受信任證書列表中)。
SSL代理——換種說法,其實就是 Man-in-the-Middle 攻擊。SSL代理,即是用自己的證書替代原來server端的證書(SSL雖然支持通信兩方都提供證書,但目前絕大多數支持HTTPS的服務,都只是一方認證,即server提供證書,不要求client也提供受信任的證書,所以SSL代理只需要替代server端的證書即可),從而解密流量。但這樣一來client端就會發現server端證書不是受信任的,但因為這只是我們自己的測試,所以我們需要信任代理生成的證書。
設置解密環境
要同時使用Fiddler和Wireshark,我們需要兩台機器:機器A運行Fiddler作為代理,機器B運行Outlook,並且將系統代理設置成機器A以將所有流量導到機器A。然后在機器B上用Wireshark監聽。之所以不能只用一台機器,是因為Wireshark的Windows版本在默認情況下,不支持loopback監聽,簡單說來,就是對127.0.0.1的監聽。之於為什么、以及如何讓其實現loopback監聽,可以參看這里和這里。最終的流程如下所示:
+------------+ +------------+ +-----------------+ | Computer A | Wireshark | Computer B | | | | +---------->| +------>| Exchange Server | | Outlook | | Fiddler | | | +------------+ +------------+ +-----------------+
設置Fiddler並導出根證書到受信任列表
Fiddler作為一個能夠代理所有HTTPS流量的工具,它需要提供所有網站的HTTPS證書。因此,最通用的做法,是自簽一個根證書,然后用這個根證書來簽發所有domain的證書,作為client,只需要信任這個根證書即可。這個方法也是流行的梯子工具——goagent所采用的。但是,Fiddler自己生成證書的工具 makecert.exe 並不提供導出其生成證書(包括根證書和生成的各個domain的證書)的private key的方法,因此,我們需要安裝一個Fiddler的插件—— CertMaker 來代替Fiddler作為證書生成工具,因為這個工具可以看到private key。
CertMaker插件並不影響Fiddler解密SSL的設置,它只是替換了Fiddler默認的證書生成過程。在Fiddler中執行以下設置:
圖1. SSL解密設置,這個會自動導入根證書到Windows證書管理器的受信任列表
圖2. 打開“允許遠程連接”的選項,保存后需要重啟Fiddler
別忘了,我們有兩台機器,因此,在機器B上面也需要將根證書添加到受信任列表。打開機器B的Windows命令行,輸入 certmgr 打開證書管理器,然后將導出的根證書分別添加到Personal和Trusted Root Certification Authorities下面的Certificate里,具體操作為:在Certificate上點擊右鍵,選擇"All Tasks"->"Import",然后選擇證書存放的位置,確定即可。
導出Fiddler生成證書的private key
在使用了CertMaker插件之后,我們能看到Fiddler的根證書的private key了。 但需要注意的是,我們需要的,不是Fiddler的根證書的private key,而是監視網站的private key。例如,如果我們要監視和https://www.example.com的通信流量,我們需要Fiddler針對這個domain簽發的證書的private key 。所以,要做到這點,需要在Fiddler中設置一個屬性:
- 在Fiddler界面左下角輸入框輸入
about:config並回車 - 在右側的about:config標簽中添加
fiddler.certmaker.bc.LogPrivateKeys,並設置為True
因為在還沒有連接要監聽的HTTPS網站時,Fiddler是不會自動為其生成證書的,而是在連接之后才會為其生成證書。所以,我們打開Wireshark,然后運行Outlook,在連接Exchange HTTPS服務器之后,Fiddler會為這個domain生成證書,現在在其Log標簽頁就可以看到這個證書了,是Base64編碼的,我們將其拷貝出來,保存成文件。 注意:直接保存到文件不符合pem證書文件的格式,我們需要在文件的開頭和結尾分別加上以下內容:
-----BEGIN PRIVATE KEY----- Base64 encoded private key here -----END PRIVATE KEY-----
導入private key到Wireshark
Reference
- https://en.wikipedia.org/wiki/Secure_Sockets_Layer
- http://wiki.wireshark.org/CaptureSetup/Loopback
- http://www.hsc.fr/ressources/articles/win_net_srv/missing_loopback.html
- https://fiddler2.com/add-ons
- http://security14.blogspot.com/2010/07/how-to-use-fiddler-and-wireshark-to.html
- http://www.iprotocolsec.com/2012/11/07/wireshark%E6%8A%80%E5%B7%A7-%E8%A7%A3%E5%AF%86ssl%E5%8D%8F%E8%AE%AE/
- https://groups.google.com/forum/#!topic/httpfiddler/lofwICmb7PQ

