Android 7.0 以上 Charles 和 Fiddler 無法抓取 HTTPS 包的解決方式
最近升級了 targetSdkVersion 到 28 後發現在 Android 7.0 以上機型 Charles 抓取 https 包時顯示找不到證書,但是 Android 6.0 機型還是可以正常抓包。原因是因為從 Android 7.0 開始,預設的網路安全性配置修改了,具體請閱讀官方文件網路安全性配置 。
問題原因
Android 6.0(API 23)及更低版本應用的預設網路安全性配置如下:
<!-- 預設允許所有明文通訊 --> <base-configcleartextTrafficPermitted="true"> <trust-anchors> <!-- 信任系統預裝 CA 證書 --> <certificatessrc="system"/> <!-- 信任使用者新增的 CA 證書,Charles 和 Fiddler 抓包工具安裝的證書屬於此類 --> <certificatessrc="user"/> </trust-anchors> </base-config>
而在 Android 7.0(API 24)及更高版本應用的預設網路安全性配置如下:
<!-- 預設允許所有明文通訊 --> <base-configcleartextTrafficPermitted="true"> <trust-anchors> <!-- 信任系統預裝 CA 證書 --> <certificatessrc="system"/> </trust-anchors> </base-config>
對比很容易發現,在 Android 7.0(API 24)及更高版本應用上,預設不再信任使用者新增的 CA 證書,所以也就不再信任 Charles 和 Fiddler 抓包工具的證書,所以抓取 HTTPS 包時才會失敗。
解決方式
所以解決該問題就需要應用信任 Charles 和 Fiddler 抓包工具的證書抓包工具即可。
最簡單的解決方式是使用 Android 6.0 以下的網路安全性配置:
新增res/xml/network_security_config.xml
:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-configcleartextTrafficPermitted="true"> <trust-anchors> <certificatessrc="system"/> <certificatessrc="user"/> </trust-anchors> </base-config> </network-security-config>
然後在清單檔案中指向該檔案:
<?xml version="1.0" encoding="utf-8"?> <manifest...> <applicationandroid:networkSecurityConfig="@xml/network_security_config" ... > ... </application> </manifest>
這種解決方式有一個安全風險:正式版的應用會有被他人抓包的風險。
如何只在除錯模式下允許抓包呢?
使用<debug-overrides>
即可實現只在android:debuggable
為true
時才生效的配置:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <debug-overrides> <trust-anchors> <certificatessrc="system"/> <certificatessrc="user"/> </trust-anchors> </debug-overrides> </network-security-config>
網上有些解決方式是將 Charles 和 Fiddler 的證書新增到raw
資料夾下的方式也可以,但是繁瑣了點。