美文网首页Android开发
Android 7.0 以上 Charles 和 Fiddler

Android 7.0 以上 Charles 和 Fiddler

作者: JohnnyShieh | 来源:发表于2019-05-06 19:54 被阅读12次

    最近升级了 targetSdkVersion 到 28 后发现在 Android 7.0 以上机型 Charles 抓取 https 包时显示找不到证书,但是 Android 6.0 机型还是可以正常抓包。原因是因为从 Android 7.0 开始,默认的网络安全性配置修改了,具体请阅读官方文档网络安全性配置

    问题原因

    Android 6.0(API 23)及更低版本应用的默认网络安全性配置如下:

    <!-- 默认允许所有明文通信 -->
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <!-- 信任系统预装 CA 证书 -->
            <certificates src="system" />
            <!-- 信任用户添加的 CA 证书,Charles 和 Fiddler 抓包工具安装的证书属于此类 -->
            <certificates src="user" />
        </trust-anchors>
    </base-config>
    

    而在 Android 7.0(API 24)及更高版本应用的默认网络安全性配置如下:

    <!-- 默认允许所有明文通信 -->
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <!-- 信任系统预装 CA 证书 -->
            <certificates src="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-config cleartextTrafficPermitted="true">
            <trust-anchors>
                <certificates src="system" />
                <certificates src="user" />
            </trust-anchors>
        </base-config>
    </network-security-config>
    

    然后在清单文件中指向该文件:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest ... >
        <application android: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>
                <certificates src="system" />
                <certificates src="user" />
            </trust-anchors>
        </debug-overrides>
    </network-security-config>
    

    网上有些解决方式是将 Charles 和 Fiddler 的证书添加到raw文件夹下的方式也可以,但是繁琐了点。

    相关文章

      网友评论

        本文标题:Android 7.0 以上 Charles 和 Fiddler

        本文链接:https://www.haomeiwen.com/subject/jptjoqtx.html