zoukankan      html  css  js  c++  java
  • Android 7.0 以上 Charles 和 Fiddler 无法抓取 HTTPS 包的解决方式

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

    https://johnnyshieh.me/posts/android-7-capture-https-package/

    发表于 2019-05-06 | 分类于 Android | 0 | 阅读次数

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

    问题原因

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

    1

    2

    3

    4

    5

    6

    7

    8

    9

    <!-- 默认允许所有明文通信 -->

    <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)到 Android 8.1(API 27)的默认网络安全性配置如下:

    1

    2

    3

    4

    5

    6

    7

    <!-- 默认允许所有明文通信 -->

    <base-config cleartextTrafficPermitted="true">

    <trust-anchors>

    <!-- 信任系统预装 CA 证书 -->

    <certificates src="system" />

    </trust-anchors>

    </base-config>

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

    1

    2

    3

    4

    5

    6

    7

    <!-- 默认禁止所有明文通信 -->

    <base-config cleartextTrafficPermitted="false">

    <trust-anchors>

    <!-- 信任系统预装 CA 证书 -->

    <certificates src="system" />

    </trust-anchors>

    </base-config>

    对比很容易发现,在 Android 7.0(API 24)到 Android 8.1(API 27),默认不再信任用户添加的 CA 证书,所以也就不再信任 Charles 和 Fiddler 抓包工具的证书,所以抓取 HTTPS 包时才会失败。而且在 Android 9.0(API 28)及更高版本上,不仅默认只系统预装的 CA 证书,还默认禁止所有明文通信(不允许 http 请求)。

    解决方式

    所以解决该问题就需要应用信任 Charles 和 Fiddler 抓包工具的证书抓包工具即可。

    最简单的解决方式是使用 Android 6.0 以下的网络安全性配置:

    添加res/xml/network_security_config.xml:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    <?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>

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

    1

    2

    3

    4

    5

    6

    7

    <?xml version="1.0" encoding="utf-8"?>

    <manifest ... >

    <application android:networkSecurityConfig="@xml/network_security_config"

    ... >

    ...

    </application>

    </manifest>

    这种解决方式有一个安全风险:正式版的应用会有被他人抓包的风险。

    如何只在调试模式下允许抓包呢?

    使用<debug-overrides>即可实现只在android:debuggabletrue时才生效的配置:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    <?xml version="1.0" encoding="utf-8"?>

    <network-security-config>

    <!-- 支持 Android 7.0 以上调试时,信任 Charles 和 Fiddler 等用户信任的证书 -->

    <debug-overrides>

    <trust-anchors>

    <certificates src="system" />

    <certificates src="user" />

    </trust-anchors>

    </debug-overrides>

    </network-security-config>

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

    在 Android 9.0(API 28)以上允许部分 http 请求

    最佳的解决方式肯定是全部使用 https 请求,安全性更高,如果有些请求或测试环境下还是需要使用 http 请求,需要在网络安全性配置添加白名单:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    <?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>

    <certificates src="system" />

    <certificates src="user" />

    </trust-anchors>

    </debug-overrides>

    </network-security-config>

  • 相关阅读:
    黑盒测试用例设计方法
    摄像头--用例设计
    单元测试框架unittest
    ES集群启动流程
    ES 系统模型
    HBase 体系结构
    HBase 数据模型
    引用中间件导致的OOM问题调查
    BeanDefinition注册逻辑解析
    spring xml 解析bean配置文件为beanDefinition过程
  • 原文地址:https://www.cnblogs.com/cute/p/12185928.html
Copyright © 2011-2022 走看看