1. 程式人生 > >使用Charles進行HTTPS抓包(包括安裝信任證書以及抓包 出現無法抓包unknown和證書無效解決方案)

使用Charles進行HTTPS抓包(包括安裝信任證書以及抓包 出現無法抓包unknown和證書無效解決方案)

背景:

在進行App測試或定位線上問題時,經常會遇到抓取HTTPS資料包的需求。一般在windows上會使用fiddler,Mac上使用Charles。對於https請求,抓到的資料因為經過了加密,只能看到亂碼。

本文介紹如何使用Charles來抓取https網路報文。操作步驟已在MAC + iphone5s上親測。

操作原理

關鍵的操作思想:
1. 構造一箇中間人代理,它有能力完成TLS/SSL握手
2. 弄到一個根證書,並用它生成簽名認證的代理伺服器證書

<p>  Charles就是一個理想的中間人,它支援SSL握手,可以自動根據根證書生成一個簽名的伺服器證書,並且它的官網為我們提供了一個根證書。(不安裝也可抓到包只不過只能抓到http的包,不能抓https的包)


  我們要做的就是在客戶端安裝好這個根證書,然後讓我們的作業系統信任它。對App來說,需要設法在IOS或Android上裝上這個官網提供的根證書。
  完成上述步驟後,App再指定Charles為它的代理伺服器,這時,App請求的伺服器證書就是Charles自動生成的代理伺服器證書。如果Charles的根證書已被信任,這個自動生成的代理伺服器證書是有效的,使用它App和Charles的TLS握手可以順利完成。</p>

以下是詳細的操作步驟:

分步指南

第一步:配置HTTP代理,這步與抓取HTTP請求是一樣的:

選擇在8888埠上監聽,然後確定。夠選了SOCKS proxy,還能截獲到瀏覽器的http訪問請求。

第二步:配置SSL代理:

首先在charles的 Proxy選項選擇SSL Proxy Settings

點add新增需要監視的域名,支援 *號萬用字元,埠一般都是443:

第三步 為手機設定代理

在手機無線中配置手動代理,輸入安裝Charles的電腦的網路地址,埠填8888。

第四步 安裝根證書

在手機上安裝Charles的根證書:

以IOS為例,在Safri上開啟Charles的根證書下載網址: chls.pro/ssl 。
順利的話會出現這樣的畫面,繼續點安裝,然後去設定裡的描述檔案管理中信任它就行了。

安卓安裝,要分作業系統 chls.pro/ssl 。

會下載下來一個charles-proxy-ssl-proxying-certificate.pem證書

有的手機需要將字尾改為'.crt',有的可直接使用,以小米為例(可直接使用)

  • 設定 > 更多設定(系統和裝置) > 系統安全 > 從儲存裝置安裝>找到相應的資料夾下的檔案>點選安裝
  • 第一次安裝需要命名

在代理開啟的情況下登入

如果不能下載,檢查手機是否正確設定了代理,Charles是否已經開啟並配置正確。

電腦端的根證書安裝

以MAC為例,直接在Charles的Help選單中安裝;安裝完成後去系統的鑰匙串訪問中信任它。

3.設定訪問域名和埠 
這裡寫圖片描述

這裡寫圖片描述

ps:大部分人會設定Host:* port:443 ;但是如果直接點選OK也是沒有問題的

以上的步驟在隨便一搜都可以找到的,但是,上面是針對ios和一部分android機子可行,android7.0的機子再去用charles抓包時候會出現一下情況: 
各種unknown

這裡寫圖片描述

此時此刻,把目光轉移到程式碼上來,不管你在charles怎麼配置都是無濟於事的

步驟如下:

1.在專案res目錄下新增一個資料夾,命名xml,並且新建一個xml檔案,可以命名為network_security_config.xml(其實。名字可以順便命名,對應就行)

這裡寫圖片描述

2.network_security_config.xml 裡面新增內容:

<span style="color:#000000"><code class="language-xml"><span style="color:#006666"><?xml version="1.0" encoding="utf-8"?></span>
<span style="color:#006666"><<span style="color:#4f4f4f">network-security-config</span>></span>
    <span style="color:#006666"><<span style="color:#4f4f4f">domain-config</span>></span>
        <span style="color:#006666"><<span style="color:#4f4f4f">domain</span> <span style="color:#4f4f4f">includeSubdomains</span>=<span style="color:#009900">"true"</span>></span>請求域名<span style="color:#006666"></<span style="color:#4f4f4f">domain</span>></span>
        <span style="color:#006666"><<span style="color:#4f4f4f">trust-anchors</span>></span>
            <span style="color:#006666"><<span style="color:#4f4f4f">certificates</span> <span style="color:#4f4f4f">src</span>=<span style="color:#009900">"@raw/證書名稱"</span>/></span>
        <span style="color:#006666"></<span style="color:#4f4f4f">trust-anchors</span>></span>
    <span style="color:#006666"></<span style="color:#4f4f4f">domain-config</span>></span>
<span style="color:#006666"></<span style="color:#4f4f4f">network-security-config</span>></span></code></span>

PS:請求域名 - 為你專案請求介面所用到的域名 
證書名稱 - 為上面提到的第二點在charles裡面點選”Save Charles Root Certificate..”(路徑: Help - SSL Proxying -Save Charles Root Certificate.. )

3.把證書放進res/raw 目錄下 ,如果沒有此目錄,需要新建

這裡寫圖片描述

ps:此時檔名稱應當和上面提到的network_security_config.xml 檔案裡面證書名稱對應

4.在AndroidManifest.xml檔案需要加入以下配置: 
這裡寫圖片描述

<span style="color:#000000"><code class="language-xml">android:networkSecurityConfig="@xml/network_security_config"</code></span>

大功告成,配置完成即可抓包。

完成後:試試看抓一下QQ空間的資料,將..qq.com 和*.qq.com 新增到SSL Proxy的Setting中後,配置好手機代理,開啟手機QQ空間App
可以看到抓取到的報文如下:

圖6

幾點說明:

  1. 本文的操作指南是在MAC+iphone5s+Charles上實踐的。文中開頭已經講述了HTTPS使用中間人代理抓包的簡單原理和核心操作思想,其他環境下可以類比。
  2. 有些人認為https可以完美防止中間人攻擊,無法抓到https的明文包...... 其實是不對的,TLS的設計只能說是從技術上最大限度地保護網路報文的安全,它無法防止使用者自己作死。
  3. 網路安全和使用者的安全意識是強相關的,技術的防範能力總是有限的。在實際生活中養成良好的上網習慣,千萬不能隨意信任不明來源的證書,輕視瀏覽器、作業系統或其他App給我們發出的安全警告。