48

Android 7.0 以上 Charles 和 Fiddler 无法抓取 HTTPS 包的解决方式

 5 years ago
source link: http://johnnyshieh.me/posts/android-7-capture-https-package/?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

最近升级了 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:debuggabletrue 时才生效的配置:

<?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 文件夹下的方式也可以,但是繁琐了点。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK