Charles :Mac下的截包工具

感謝唐巧老師(原文)

簡介

本文爲 InfoQ 中文站特供稿件,首發地址爲:文章鏈接。如需轉載,請與 InfoQ 中文站聯繫。

Charles 是在 Mac 下常用的截取網絡封包的工具,在做 iOS 開發時,我們爲了調試與服務器端的網絡通訊協議,常常需要截取網絡封包來分析。Charles 通過將自己設置成系統的網絡訪問代理服務器,使得所有的網絡訪問請求都通過它來完成,從而實現了網絡封包的截取和分析。

Charles 是收費軟件,可以免費試用 30 天。試用期過後,未付費的用戶仍然可以繼續使用,但是每次使用時間不能超過 30 分鐘,並且啓動時將會有 10 秒種的延時。

因此,該付費方案對廣大用戶還是相當友好的,即使你長期不付費,也能使用完整的軟件功能。只是當你需要長時間進行封包調試時,會因爲 Charles 強制關閉而遇到影響。

Charles 主要的功能包括:

  1. 支持 SSL 代理。可以截取分析 SSL 的請求。
  2. 支持流量控制。可以模擬慢速網絡以及等待時間(latency)較長的請求。
  3. 支持 AJAX 調試。可以自動將 json 或 xml 數據格式化,方便查看。
  4. 支持 AMF 調試。可以將 Flash Remoting 或 Flex Remoting 信息格式化,方便查看。
  5. 支持重發網絡請求,方便後端調試。
  6. 支持修改網絡請求參數。
  7. 支持網絡請求的截獲並動態修改。
  8. 檢查 HTML,CSS 和 RSS 內容是否符合 W3C 標準

安裝 Charles

去 Charles 的官方網站(http://www.charlesproxy.com)下載最新版的 Charles 安裝包,是一個 dmg 後綴的文件。打開後將 Charles 拖到 Application 目錄 下即完成安裝。

安裝 SSL 證書

如果你需要截取分析 SSL 協議相關的內容。那麼需要安裝 Charles 的 CA 證書。具體步驟如下:

  1. 去 http://www.charlesproxy.com/ssl.zip 下載 CA 證書文件。
  2. 解壓該 zip 文件後,雙擊其中的 .crt 文件,這時候在彈出的菜單中選擇 “總是信任”,如下所示:
  3. 從鑰匙串訪問中即可看到添加成功的證書。如下所示: 

將 Charles 設置成系統代理

之前提到,Charles 是通過將自己設置成代理服務器來完成封包截取的,所以使用 Charles 的第一步是將其設置成系統的代理服務器。

啓動 Charles 後,第一次 Charles 會請求你給它設置系統代理的權限。你可以輸入登錄密碼授予 Charles 該權限。你也可以忽略該請求,然後在需要將 Charles 設置成系統代理時,選擇菜單中的 “Proxy” –> “Mac OS X Proxy” 來將 Charles 設置成系統代理。如下所示:

之後,你就可以看到源源不斷的網絡請求出現在 Charles 的界面中。

Charles 主界面介紹

Charles 主要提供 2 種查看封包的視圖,分別名爲 “Structure” 和 “Sequence”。

  1. Structure 視圖將網絡請求按訪問的域名分類。
  2. Sequence 視圖將網絡請求按訪問的時間排序。

大家可以根據具體的需要在這兩種視圖之前來回切換。

對於某一個具體的網絡請求,你可以查看其詳細的請求內容和響應內容。如果響應內容是 JSON 格式的,那麼 Charles 可以自動幫你將 JSON 內容格式化,方便你查看。

過濾網絡請求

通常情況下,我們需要對網絡請求進行過濾,只監控向指定目錄服務器上發送的請求。對於這種需求,我們有 2 種辦法。

  1. 在主界面的中部的 Filter 欄中填入需要過濾出來的關鍵字。例如我們的服務器的地址是:http://yuantiku.com , 那麼只需要在 Filter 欄中填入 yuantiku 即可。

  2. 在 Charles 的菜單欄選擇 “Proxy”–>“Recording Settings”,然後選擇 Include 欄,選擇添加一個項目,然後填入需要監控的協議,主機地址,端口號。這樣就可以只截取目標網站的封包了。如下圖所示:

通常情況下,我們使用方法 1 做一些臨時性的封包過濾,使用方法 2 做一些經常性的封包過濾。

截取 iPhone 上的網絡封包

Charles 通常用來截取本地上的網絡封包,但是當我們需要時,我們也可以用來截取其它設備上的網絡請求。下面我就以 iPhone 爲例,講解如何進行相應操作。

Charles 上的設置

要截取 iPhone 上的網絡請求,我們首先需要將 Charles 的代理功能打開。在 Charles 的菜單欄上選擇 “Proxy”->“Proxy Settings”,填入代理端口 8888,並且勾上 “Enable transparent HTTP proxying” 就完成了在 Charles 上的設置。如下圖所示:

iPhone 上的設置

首先我們需要獲取 Charles 運行所在電腦的 IP 地址,打開 Terminal,輸入ifconfig en0, 即可獲得該電腦的 IP,如下圖所示:

在 iPhone 的 “設置”->“無線局域網 “中,可以看到當前連接的 wifi 名,通過點擊右邊的詳情鍵,可以看到當前連接上的 wifi 的詳細信息,包括 IP 地址,子網掩碼等信息。在其最底部有 “HTTP 代理” 一項,我們將其切換成手動,然後填上 Charles 運行所在的電腦的 IP,以及端口號 8888,如下圖所示:

設置好之後,我們打開 iPhone 上的任意需要網絡通訊的程序,就可以看到 Charles 彈出 iPhone 請求連接的確認菜單(如下圖所示),點擊 “Allow” 即可完成設置。

截取 SSL 信息

Charles 默認並不截取 SSL 的信息,如果你想對截取某個網站上的所有 SSL 網絡請求,可以在該請求上右擊,選擇 SSL proxy,如下圖所示:

這樣,對於該 Host 的所有 SSL 請求可以被截取到了。

模擬慢速網絡

在做 iPhone 開發的時候,我們常常需要模擬慢速網絡或者高延遲的網絡,以測試在移動網絡下,應用的表現是否正常。Charles 對此需求提供了很好的支持。

在 Charles 的菜單上,選擇 “Proxy”–>“Throttle Setting” 項,在之後彈出的對話框中,我們可以勾選上 “Enable Throttling”,並且可以設置 Throttle Preset 的類型。如下圖所示:

如果我們只想模擬指定網站的慢速網絡,可以再勾選上圖中的 “Only for selected hosts” 項,然後在對話框的下半部分設置中增加指定的 hosts 項即可。

修改網絡請求內容

有些時候爲了調試服務器的接口,我們需要反覆嘗試不同參數的網絡請求。Charles 可以方便地提供網絡請求的修改和重發功能。只需要在以往的網絡請求上點擊右鍵,選擇 “Edit”,即可創建一個可編輯的網絡請求。如下所示:

我們可以修改該請求的任何信息,包括 url 地址,端口,參數等,之後點擊 “Execute” 即可發送該修改後的網絡請求(如下圖所示)。Charles 支持我們多次修改和發送該請求,這對於我們和服務器端調試接口非常方便。

總結

通過 Charles 軟件,我們可以很方便地在日常開發中,截取和調試網絡請求內容,分析封包協議以及模擬慢速網絡。用好 Charles 可以極大的方便我們對於帶有網絡請求的 App 的開發和調試。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章