Android 實作抓取Https資料
- 1.為啥要會抓包
- 2.電腦手機同一局域網,設定手機手動代理,
- 3.抓取Https,Charles需要設定什么
- 4.抓取Https,手機需要設定什么
- 5.Android 7.0 以上Charles無法抓取HTTPS包解決
- 6.完結撒花
1.為啥要會抓包
a.當公司沒有介面檔案,但需要做介面測驗的時候,需要通過代理工具,對介面進行抓取,
b.當開發上傳圖片時,不知道自己到底上傳沒上傳,這時候就可以通過抓包來收集證據,避免后臺甩鍋,

2.電腦手機同一局域網,設定手機手動代理,
a.可通過Charles查看電腦IP地址,也可以通過命令列輸入ipconfig查看IP地址

b.之后通過設定手機手動代理,埠號設定為8888

設定完后,Charles會彈出一個框框,如下圖所示,然后選擇Allow,

這樣就可以愉快的抓取手機的請求資訊了,

c.到目前為止只能抓取Http介面的資料,如果是Https的請求就會出現下圖的這種情況,那么我們應該怎么辦呢?


3.抓取Https,Charles需要設定什么
a.先打開Charles 的代理功能:在選單欄上選擇“Proxy -> Proxy Settings”,填入代理埠 8888,并且勾上 “Enable transparent HTTP proxying”;
b.再選擇“Proxy—SSL Proxy Settings”,勾選“Enable SSL Proxying”,在Location部分選擇add,如下圖所示,host中填“”,port中填“”,表示任務域名的資料;

c.在Charles 的頂部選單,點擊“Help -> SSL Proxying -> Install Charles Root Certificate on a Mobile Device or Remote Browser”;

然后會出現一個彈窗,點擊彈窗中“確定”;

4.抓取Https,手機需要設定什么
a.打開手機瀏覽器,輸入http://chls.pro/ssl,訪問該地址會下載charles證書,將此證書安裝到手機上;

b.在設定里面搜索證書,然后點擊安裝證書,然后找到剛才的證書點擊安裝,


5.Android 7.0 以上Charles無法抓取HTTPS包解決
從 Android 7.0 開始,默認的網路安全性配置修改了,所以需要進行一些代碼上的配置操作,
a.Android 6.0及更低版本的應用默認網路安全性配置如下:
<!-- 默認允許所有明文通信 -->
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<!-- 信任系統預裝 CA 證書 -->
<certificates src="system" />
<!-- 信任用戶添加的 CA 證書,Charles 和 Fiddler 抓包工具安裝的證書屬于此類 -->
<certificates src="user" />
</trust-anchors>
</base-config>
b.Android 7.0-8.0的默認網路安全性配置如下:
<!-- 默認允許所有明文通信 -->
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<!-- 信任系統預裝 CA 證書 -->
<certificates src="system" />
</trust-anchors>
</base-config>
c.Android 9.0及更高版本的默認網路安全性配置如下:
<!-- 默認禁止所有明文通信 -->
<base-config cleartextTrafficPermitted="false">
<trust-anchors>
<!-- 信任系統預裝 CA 證書 -->
<certificates src="system" />
</trust-anchors>
</base-config>
通過a、b、c的對比可以從中發現規律,在 Android 7到 Android 8.1,默認不再信任用戶添加的 CA 證書,所以也就不再信任 Charles抓包工具的證書,所以抓取 HTTPS 包時才會失敗,而且在 Android 9.0(API 28)及更高版本上,不僅只默認系統預裝的 CA 證書,還默認禁止所有明文通信(不允許 http 請求),

劃重點(大招來了)
前提:在手機端和電腦端都必須安裝https的安全證書
配置:打測驗包時,專案設定默認信任所有證書(系統+用戶,Charles)
First:在工程res檔案夾下的xml目錄(沒有xml就自己創建一個)中創建一個名為 network_security_config.xml的檔案

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<!-- 支持 Android 9.0 以上使用部分域名時使用 http -->
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">sample.domain</domain>
</domain-config>
<!-- 支持 Android 7.0 以上除錯時,信任 Charles 和 Fiddler 等用戶信任的證書 -->
<debug-overrides>
<trust-anchors>
<!-- 信任系統預裝 CA 證書 -->
<certificates src="system" />
<!-- 信任用戶添加的 CA 證書,Charles 和 Fiddler 抓包工具安裝的證書屬于此類 -->
<certificates src="user" />
</trust-anchors>
</debug-overrides>
</network-security-config>
Second:在AndroidManifest里的標簽中,添加如下代碼,在清單檔案中指向該檔案:
<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
<application android:networkSecurityConfig="@xml/network_security_config"
... >
...
</application>
</manifest>
然后重新再運行專案,結果看下方,
6.完結撒花

這樣就可以快樂的看到抓取https的請求了,

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/261756.html
標籤:其他
