天天看點

Charles抓取Android裝置HTTPS包

一、前言

作為一個移動應用開發者,我們在平時的應用開發過程中,除了UI界面的相關編碼之外,做的最多的編碼工作就是和服務端程式員進行接口的聯調;當然在接口聯調的過程中,往往會出現接口調試不通的情況,可能是我們确實沒有按照接口文檔的要求來進行接口請求,如沒有按照指定的請求方式Post/Get,請求頭Header,Content-Type,或者請求參數等來進行正确的接口請求 ,當然也有可能是服務端程式本身的問題,為了快速定位我們請求是否是有問題,我們可以通過一些抓包工具Wireshare、Charles等來對我們發出的請求進行抓包,以此來檢視接口請求的各項配置是否是正确的;本篇文章介紹一下Charles抓包的流程;

二、Charles抓包

1.下載下傳安裝Charles

下載下傳位址:https://www.charlesproxy.com/download/

下載下傳之後正常安裝即可,安裝完成成後,打開程式後主界面如下圖所示

Charles抓取Android裝置HTTPS包

2.抓包設定

2.1 設定Charles允許代理HTTP請求

Charles中->Proxy->Proxy Setting 中設定代理的端口号為8888,并且勾選允許代理HTTP請求,如圖所示

Charles抓取Android裝置HTTPS包

2.2 Android 裝置端相關設定

(1)首選将Android裝置連入與電腦相同網絡,如同一WIFI;

(2)設定手機的代理

打開手機的WIFI清單,點選已連接配接的WIFI,找到代理設定,設定主機名為

電腦的IP位址,電腦的IP位址可以在CMD視窗中通過ipconfig檢視,也可以在Charles中Help->Local IP Address中檢視;設定代理的端口号8888,如下圖所示

Charles抓取Android裝置HTTPS包

Android裝置設定過代理之後,電腦上的Charles就可以抓取Android裝置上的HTTP請求了,并且可以檢視到HTTP請求的完整請求配置,請求方式,Header,Content-Type,請求的參數等

如圖所示,我在手機浏覽器中輸入了一個HTTP請求接口,Charles成功抓取到了

Charles抓取Android裝置HTTPS包

但是僅僅這樣設定,隻能成功抓取HTTP請求,不能夠抓取HTTPS請求,或者準确的說是抓取到HTTPS請求,但是無法檢視到具體的請求配置,如請求參數等,會出現unknow的情況;

Charles抓取Android裝置HTTPS包

下面我們就來看下,如何抓取HTTPS請求;

2.3 抓取HTTPS請求包

2.3.1 電腦上安裝Charles證書

help —> SSl Proxying —> install charles root certificate —> 安裝證書

Charles抓取Android裝置HTTPS包
Charles抓取Android裝置HTTPS包
Charles抓取Android裝置HTTPS包
Charles抓取Android裝置HTTPS包

這樣電腦上就成功安裝了Charles證書

2.3.2 設定SSL Proxying

Proxy —> SSL Proxy Settings —> 然後add操作,host設定為*表示所有, Port設定為443

Charles抓取Android裝置HTTPS包
Charles抓取Android裝置HTTPS包

這樣設定之後,如果Android裝置的系統版本在Android 7.0之前,是可以正常抓HTTPS包的,但是Android 7.0開始是無法正常抓HTTPS包的,在Android 7.0以上應用内請求HTTPS接口會報錯

對于Android 7.0及以上的裝置還需要進行如下操作

2.4 Android 7.0及以上裝置HTTPS抓設定

2.4.1 Android裝置上安裝Charles證書

(1)Android 裝置下載下傳Chales證書

手機上浏覽器輸入chls.pro/ssl,下載下傳Charles證書,下載下傳下來的證書如果字尾名不是.crt,需要将證書字尾名修改成.crt,然後儲存到SD卡下某個目錄中,我這裡儲存到了SD卡根目錄下

Charles抓取Android裝置HTTPS包

(2)Android 裝置安裝Charles證書

設定->系統安全->加密憑據->安裝證書->CA憑證 然後找到之前下載下傳的Charles證進行安裝;

Charles抓取Android裝置HTTPS包

安裝之後,在設定->系統安全->加密憑據->信任的憑據->使用者中可以看到我們安裝的Charles證書

Charles抓取Android裝置HTTPS包

2.4.2. 要抓取的HTTPS請求的包應用中需設定

在Android 7.0開始引入了Network Security Configuration的安全功能。這個新功能允許開發人員在不修改應用程式代碼的情況下自定義他們的網絡安全設定。如果應用程式運作的系統版本高于或等于Android 7.0(API 24),并且targetSdkVersion>=24,則隻有系統(system)證書才會被信任。是以使用者(user)導入的Charles根證書是不被信任的。

我們在項目res目錄下建立一個xml目錄,然後建立一個network_security_configuration檔案,内容如下

<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates
                overridePins="true"
                src="system" />
            <certificates
                overridePins="true"
                src="user" />
        </trust-anchors>
    </base-config>
</network-security-config>
           

然後在AndroidManifest.xml的Application标簽下通過android:networkSecurityConfig屬性使用

<application
        android:name=".constant.LocalApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.KotlinDemo"
        android:networkSecurityConfig="@xml/network_security_config"
        >
        ....
        </application
           

至此就可以正常在電腦的Charles中抓取Android裝置應用中的HTTPS請求了

Charles抓取Android裝置HTTPS包

3.Charles抓包原理

我們給Android裝置連接配接的WIFI設定了代理,這個代理的IP是與Android裝置同一網絡的PC電腦,而Charles是運作在這個PC電腦上,并且設定了Charles可以代理 電腦上的HTTP請求,是以Charles也就變成了Android裝置的HTTP請求代理伺服器,Android裝置上的所有HTTP請求都會經過Charles;

實際的過程是Android裝置上的HTTP請求,都會被Charles截獲到,然後Charles僞裝成用戶端與HTTP請求的服務端進行通信,服務端處理後傳回的結果也會先經過Charles,然後Charles再将傳回的結果傳回給Android用戶端;

結合HTTPS請求過程來描述Charles抓包原理:

1.用戶端發送的請求經過Charles,Charles截獲用戶端請求僞裝成用戶端和

服務端建立連接配接(HTTPS連接配接握手過程)

2.服務端會傳回數字證書給用戶端,這個時候數字證書也是先到達Charles,

Charles用根證書的公鑰解密出數字證書,數字證書中包括了(服務端傳回的非對稱加密公鑰,以及證書頒發給,頒發者,過期時間等資訊)

3.Charles用自己的數字證書替換服務端的數字證書,然後傳回給用戶端

4.然後用戶端就按照正常的HTTPS請求過程,因為我們在Android裝置上安裝了Charles證書,是以可以正常解密出Charles發送過來的數字證書,是以可以正常獲得伺服器發過來的非對稱加密的公鑰; 用戶端就正常生成一個對稱加密的秘鑰,對請求資料進行加密,然後使用解密出來的服務端非對稱加密的公鑰對生成的對稱加密的秘鑰進行加密,然後發送給伺服器

5.這個時候Charles又截獲了用戶端發過來的加密後的請求資料,由于Charles之前擷取到了真正服務端的私鑰,是以是可以解密出用戶端的對稱加密秘鑰以及請求資料,是以可以顯示出HTTPS請求資料給抓包者看,Charles會将截獲的用戶端請求發給服務端

6.服務端收到Charles發出來的請求,解密出對稱加密秘鑰,然後解密出請求資料,處理後,傳回的結果資料使用解密出來的對稱加密秘鑰加密,然後傳回

7.Charles收到服務端的傳回結果,同樣的由于之前擷取到對稱加密秘鑰,是以可以解密出傳回資料顯示出來給抓包者看;然後Charkes會将服務端的傳回結果傳回給用戶端;

這樣Charles就作為中間代理者,可以抓取到整個用戶端與服務端的通信過程

Charles抓取Android裝置HTTPS包

歡迎掃碼訂閱公衆号,公衆号主要分享原創或轉載移動開發技術文章,和廣大移動開發者一起學習成長!

繼續閱讀