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

结论:由于安卓7.0后,用户安装的证书不被信任,导致无法使用charles等抓包工具对https的请求包进行正常的解析,所以直接用安卓7.0以下的手机来进行抓包,或者最简单的就是用安卓7.0以下的模拟器!

 

 

前言

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

问题描述

在安卓7.0及以上的版本,即使安装了charles证书,也会导致抓取https包失败
在这里插入图片描述
如图 https 包出现 unknow 报错

为什么这样

Android6.0网络默认配置:

    
        
            
            
        
    

Android 7.0到 Android 8.1的默认配置:

    
        
            
        
    

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


        
            
        
    

简单解释一下这几个参数的意思:
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文件(如果没有对应文件夹可以建立对应文件夹)
文件内容:



    
        
            
            
        
    

3.打包和签名

打包:

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/

你可能感兴趣的:(Android,抓包,https)