標籤:safari res sed 通過 iba pretty 網站 ios java
眾所周知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,並設定Proxy 伺服器。然後開啟瀏覽器,輸入網關IP(即設定的Proxy 伺服器IP,PC的IP地址)+:8888。例如My Phone在串連上全民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反向 Proxy對外提供服務。用這種方法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,大家學會了嗎?
使用Fiddler抓包調試https下的頁面