使用Fiddler抓包調試https下的頁面


眾所周知https技術誕生以來,一個很重要的作用就是加密通信內容。所以在項目團隊將業務站點實施完https改造以后,原先使用fiddler進行抓包的美好生活到頭了。其實fiddler本身是支持對於https請求的抓包的,同時還能在開發環境不支持https的情況下,將https請求轉發到http請求上。 下面讓我帶大家一起走進科學,只需要對fiddler加點一丟丟特技,讓它能夠在https的環境下duang起來。 

一、啟用Fiddler的https捕獲功能

打開Fiddler,依次選擇Tools->Fiddler Options->HTTPS,勾選“Capture HTTPS CONNECTs”和“Decrypt HTTPS traffic”。點擊“OK”以后Fiddler會彈出一個對話框問你是否要讓Windows信任Fiddler生成的自簽證書,選擇“Yes”以后,還會彈出一些對話框,直接“Yes”或“Ok”即可。

將PC瀏覽器的代理設置為127.0.0.1:8888(Fiddler默認代理)以后,隨便訪問一個https網站就可以在Fiddler中看到對應的請求,和正常訪問http幾乎相同。Reference:Fiddler這里其實是利用類似中間人欺騙的方法,讓系統信任Fiddler生成的自簽證書,之后所有通過Fiddler的https請求均會被Fiddler“篡改”重新使用Fiddler生成的證書加密,以達到監聽https的目的。

二、在手機上安裝Fiddler證書(以iOS為例)

在iOS中使用全民Wi-Fi或類似技術連接上Fiddler,並設置代理服務器。然后打開瀏覽器,輸入網關IP(即設置的代理服務器IP,PC的IP地址)+:8888。例如我的手機在連接上全民Wi-Fi以后,分配到的網關IP是127.16.0.1,那么直接在Safari中輸入 http://127.16.0.1:8888 ,瀏覽器會打開如下的頁面:點擊頁面最下方的FiddlerRoot certificate,iOS會打開安裝證書頁面:點擊右上角Install,iOS會讓你輸入手機的PIN密碼。這時iOS可能會彈出一個Warning/警告信息,提醒你正在添加的證書無法驗證。忽略之,繼續點上角的Install即可安裝完成。完成安裝證書以后,就可以在iOS上直接訪問https地址,所有的請求對於Fiddler來說也都是透明的了。 如果需要刪除之前添加的證書,只需要在iOS上打開“Settings”->“General”->"Profile",當中列出了用戶手機上已經安裝的證書,選擇“DO_NOT_TRUST_FiddlerRoot”刪除之即可。

三、瞞天過海讓nodejs直接支持https

nodejs一種比較主流的架構是在服務器上直接運行一個非80/443端口的服務,再使用nginx反向代理對外提供服務。用這種方法nodejs層面完全不需要考慮https及相關的技術問題,所有的https請求均由nginx去處理。在這種情況下,我們的開發環境一般不會額外安裝nginx去處理https請求,那么我們需要如何讓nodejs支持https請求呢?

我們知道https通信在開始時會發送一個METHOD為CONNECT的請求,讓服務器將證書以及相關的信息返回給瀏覽器,在沒有得到這些信息之前,瀏覽器是不會信任服務器發來的任何數據的。So現在我們要讓Fiddler幫我一起騙過瀏覽器,讓他心甘情願把數據交出來。

打開Fiddler,在右側的選項卡中找到FiddlerScript頁簽(沒有找到FiddlerScript頁簽的同學請移步 http://www.telerik.com/download/fiddler/fiddlerscript-editor 下載安裝即可),從Go To后的下拉列表中選擇“OnBeforeRequest”。在這里我們可以看到很多很多的。。。。。代碼,然后都不用管它,直接拉到OnBeforeRequest方法的結尾。

FiddlerScript使用的語言JScript.Net是一個以JavaScript為基礎,長得有點像C#,Editor和VB很像的一個雜交體,本質上來說和JavaScript差別不大,有興趣的同學可以參考 《Fiddler (二) Script 用法》 這篇文章。

在OnBeforeRequest方法的結尾加入如下代碼:

static function OnBeforeRequest(oSession: Session){ var hosts = 'zkd.me develop.dog'; FiddlerApplication.Log.LogFormat("Logger session {0}, Url: {1}, isHttps: {2}, port: {3}", oSession.id, oSession.fullUrl, oSession.isHTTPS, oSession.port); if(hosts.indexOf(oSession.host) > -1){ FiddlerApplication.Log.LogFormat("Capture session {0}, Url: {1}, isHttps: {2}, port: {3}", oSession.id, oSession.fullUrl, oSession.isHTTPS, oSession.port); if(oSession.HTTPMethodIs('CONNECT')){ FiddlerApplication.Log.LogString('create fake tunnel response'); oSession['x-replywithtunnel'] = 'FakeTunnel'; return; } if (oSession.isHTTPS){ FiddlerApplication.Log.LogString('switch https to http request'); oSession.fullUrl = oSession.fullUrl.Replace("https://","http://"); oSession.port = 80; } FiddlerApplication.Log.LogFormat("Processed session {0}, Url: {1}, isHttps: {2}, port: {3}", oSession.id, oSession.fullUrl, oSession.isHTTPS, oSession.port); } FiddlerApplication.Log.LogFormat("Logger session {0}, Url: {1}, isHttps: {2}, port: {3}", oSession.id, oSession.fullUrl, oSession.isHTTPS, oSession.port); }

hosts變量定義的域名就是我們想讓Fiddler幫我們一起欺騙瀏覽器的域名。點擊FiddlerScript界面左上角的“Save Script”,伴隨着一聲“滴咚”,配置就生效了。

這段代碼的作用是判斷如果這些指定的域名上有從瀏覽器傳來CONNECT的請求時,直接返回一個假的Response,這時Fiddler不會再試圖去讓請求的實際響應者回應這個CONNECT請求,而是自己返回了一個請求。瀏覽器在收到這個請求以后不明就里,認為是服務器已經返回了安全信息,於是便愉快地繼續發送請求。Fiddler在收到之后的請求,會將URL中的https替換為http,端口強制更換為80,再發給請求的實際響應者。 下圖可以比較容易看出Fiddler在這一過程中扮演的角色。 總之,只要通過上述不太復雜這一系列的特技,就可以讓Fiddler幫助我們在https環境下方便地進行debug,大家學會了嗎?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM