关于安卓7.0版本以上charles无法抓取https包的问题解决办法

前言

解决这个问题比较复杂,需要花费大量时间来解决这个问题,如果没有耐心是不能成功的.可以说这里解决的每一步都有坑

问题描述

在安卓7.0及以上的版本,即使安装了charles证书,也会导致抓取https包失败
关于安卓7.0版本以上charles无法抓取https包的问题解决办法_第1张图片
如图 https 包出现 unknow 报错

为什么这样

Android6.0网络默认配置:

    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
            <certificates src="user" />
        trust-anchors>
    base-config>

Android 7.0到 Android 8.1的默认配置:

    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
        trust-anchors>
    base-config>

Android 9及更高版本应用的默认配置:

<base-config cleartextTrafficPermitted="false">
        <trust-anchors>
            <certificates src="system" />
        trust-anchors>
    base-config>

简单解释一下这几个参数的意思:
cleartextTrafficPermitted 是否允许http明文传输
certificates src="system"信任系统证书
certificates src="user"信任用户安装的证书

通过几个版本对比可以看出,从 安卓7.0版本开始系统已经不再信任用户安装的证书,而安卓9.0 后系统默认禁止了http明文传输

上面所说的配置都是在安装包里面没有配置网络的情况下,系统默认的网络配置是这样的,如果有安装包里面的网络配置,那么优先执行安装包里面的网络配置. 即安装包配置的优先级高于系统默认配置

所以解决这个问题的办法,可以修改或添加apk中的网络配置来信任用户安装的证书,然后重新打包签名,这样抓包就不会报错了

开始解决

1.解包(反编译)

使用 apktool 来进行反编译,不同系统的安装的方法大致相同
反编译

apktool d 安装包名字

这一步可能会遇到各种错误,不过大部分原因都是由于 apktool.jar版本导致的,优先使用最新版本,如果解包失败,那么更换几个apktool.jar的版本

2.修改网络配置文件

在安装包同级目录下会生成一个与安装包名字相同的文件夹,里面就是apk反编译后的内容了,首先在 AndroidManifest.xml 添加网络配置选项
application标签中添加配置
在这里插入图片描述

android:networkSecurityConfig="@xml/network_security_config"

然后在res/xml/路径下 新建network_security_config.xml文件(如果没有对应文件夹可以建立对应文件夹)
文件内容:


<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
            <certificates src="user" />
        trust-anchors>
    base-config>
network-security-config>

3.打包和签名

打包:

apktool b 文件夹名字

打包后的apk存在于dist文件夹下

签名:
签名我这里用的是signapk.jar
使用命令进行签名:

java -jar signapk.jar testkey.x509.pem testkey.pk8 旧安装包 新安装包

之后就可以安装新安装包(签名后的)

后续

再次进行抓包就不会出现问题了

其实不如买一个 安卓7.0以下的手机进行抓包,或者直接使用苹果手机进行抓包

你可能感兴趣的:(关于安卓7.0版本以上charles无法抓取https包的问题解决办法)