结论:由于安卓7.0后,用户安装的证书不被信任,导致无法使用charles等抓包工具对https的请求包进行正常的解析,所以直接用安卓7.0以下的手机来进行抓包,或者最简单的就是用安卓7.0以下的模拟器!
前言
解决这个问题比较复杂,需要花费大量时间来解决这个问题,如果没有耐心是不能成功的.可以说这里解决的每一步都有坑
问题描述
在安卓7.0及以上的版本,即使安装了charles证书,也会导致抓取https包失败
如图 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中的网络配置来信任用户安装的证书,然后重新打包签名,这样抓包就不会报错了
开始解决
使用 apktool 来进行反编译,不同系统的安装的方法大致相同
反编译
apktool d 安装包名字
这一步可能会遇到各种错误,不过大部分原因都是由于 apktool.jar版本导致的,优先使用最新版本,如果解包失败,那么更换几个apktool.jar的版本
在安装包同级目录下会生成一个与安装包名字相同的文件夹,里面就是apk反编译后的内容了,首先在 AndroidManifest.xml 添加网络配置选项
在 application标签中添加配置
android:networkSecurityConfig="@xml/network_security_config"
然后在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>
打包:
apktool b 文件夹名字
打包后的apk存在于dist文件夹下
签名:
签名我这里用的是signapk.jar
使用命令进行签名:
java -jar signapk.jar testkey.x509.pem testkey.pk8 旧安装包 新安装包
之后就可以安装新安装包(签名后的)
后续
再次进行抓包就不会出现问题了
其实不如买一个 安卓7.0以下的手机进行抓包,或者直接使用苹果手机进行抓包
转载自:https://blog.csdn.net/chouzhou9701/article/details/105408761/