通過Charles代理,我們能很輕易的抓取手機的Http請求,因為Http屬於明文傳輸,所以我們能直接獲取到我們要抓取的內容。但是Https內容本身就是加密的,這時我們會發現內容是加密的了。本文我們來講述一下如何使用Charles抓取Https數據包及相關原理知識。
一、Https客戶端和服務器端通信的基本流程
其實Charles就是這么做的,當配置了Charles之后,理論上所有的http/https請求數據都被攔截到了。看下面一張簡化的中間人抓包的圖:

二、如何使用Charles抓取Android設備發送的Https數據請求
注:為了保證最簡單的方式實現,下面的Android設備默認都是Android 6.0及以下。
保證Android手機和抓取https請求的電腦在同一網絡下,然后就可以開始進行抓取操作了。抓取主要分為三步,分別如下:
1.手機上導入Charles根證書
按照如下圖所示操作即可:
2.設置Android 手機代理
按照如下圖的配置設置是最簡單的:

3.添加SSL代理設置

配置到此,我們就可以正常抓取到Https明文數據了。
(Android 6.0及以下版本的部分手機因為廠商高度訂制,可能存在安裝CA證書失敗的情況,這會導致無法通過Charles抓取到https的數據)
三、Android 7.0及以上為何不能輕易抓取到Https請求的明文數據?
1. 問題分析
其實Charles上顯示確實抓到了包,但是當我們看抓包的詳細數據時會發現報錯 You may need to configure your browser or application to trust the Charles Root Certificate. See SSL Proxying in the Help menu
。Charles說手機端沒有信任Charles的根證書,但是我們手機上已經安裝了Charles根證書了,為什么會這樣?
原來在Android 7.0(API 24 ) ,有一個名為“Network Security Configuration”的新安全功能。這個新功能的目標是允許開發人員在不修改應用程序代碼的情況下自定義他們的網絡安全設置。如果應用程序運行的系統版本高於或等於24,並且targetSdkVersion>=24,則只有系統(system)證書才會被信任。所以用戶(user)導入的Charles根證書是不被信任的。
2. Android 7.0 (api 24 ) 和 targetSdkVersion 對抓包的影響
這里要分兩種情況:
- 抓自己開發的app的網絡包
- 抓第三方app的網絡包,比如微博客戶端
這兩種情況有什么區別的,第一種app是我們自己開發的,我們手里有源碼,能夠修改,能夠做到像官方文檔里面說的一樣進行配置。第二種我們沒有源碼,要想做到像官方文檔里面配置的話,只能反編譯后,把配置文件添加進去然后重新打包,但是重新打包就會遇到很多坑,並不一定能成功,所以需要使用其他方式達到抓包目的。
引用官方文檔一句話:默認情況下,來自所有應用的安全連接(使用 TLS 和 HTTPS 之類的協議)均信任預裝的系統 CA,而面向 Android 6.0(API 級別 23)及更低版本的應用默認情況下還會信任用戶添加的 CA 存儲。應用可以使用 base-config(應用范圍的自定義)或 domain-config(按域自定義)自定義自己的連接。
四、Charles為何抓不到App的數據包
這是因為數據包的傳輸會受到當前的網路上的路由器安全策略及電腦的防火牆及殺毒軟件配置的影響。當我們都配置完成了,發現仍無法抓取數據包的時候,就需要我們檢查一下防火牆的設置及殺毒軟件的設置,一般情況下,當我們關了防火牆或殺毒軟件后,基本就能正常抓取到數據包了。
五、參考內容
1. Android 系統各個版本上https的抓包:https://www.jianshu.com/p/3b4cd6fdd8a9
2. Html標簽清除:http://www.jiniannet.com/Page/clearhtml
3. Unicode編碼轉換:http://tool.chinaz.com/tools/unicode.aspx