使用Charles抓包Android Studio模拟器时配置证书的问题与解决方法
所属分类:Android | 发布于 2023-03-06
耗费了好几个小时,终于实现了使用Charles对Android Studio模拟器抓包功能。
Android Studio自带的App Inspection有抓包的功能,但是对于一个初学者来说,写的代码不稳定,稍微一不注意就闪退了,闪退的时候App Inspection抓取的信息就丢失了,没办法去找原因。
由于Fiddler只支持windows系统,所以在mac下还是选择使用Charles进行抓包。
使用Charles除了通用的配置外,如果要抓取https,还要配置证书,这是这篇文章的核心所在。
证书问题
1、解决方案一
高版本的Androd只信任系统级别的三方证书,用户级别的证书被使用,所以要求将证书安装系统级别,具体位置是/system/etc/security/cacerts目录下,但是这个目录是不可写的,于是在网上找各种教程,目的是为了把这个目录改为可写目录。耗费了大量精力,逐一尝试后,无果。这个过程中学到了adb命令和emualtor命令,但是始终都是不行,最关键的一个命令 disable-verity命令执行不了。
2、解决方案二
证书安装到用户级别好像也能访问,但是对于用户级别的证书,使用的网络请求库Retrofit底层的OkHttp要求自己验证证书,要写一个证书的验证方法,网上搜的是java版本的,自己的kotlin又是刚学,就直接把这个解决方法放弃了。
3、解决方案三
就在快要绝望的时候,又在网上看到了有人在说用配置文件的方法,后来又研究了好一会儿,发现这个方法是可行的。
核心的内容实际上是这个网络安全配置:https://developer.android.google.cn/training/articles/security-config?hl=zh-cn#manifest
3.1、在AndroidManifest.xml的application段增加android:networkSecurityConfig
android:networkSecurityConfig="@xml/network_security_config"
3.2、配置res/xml/network_security_config.xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="@raw/charles_certificate" />
<certificates src="system" />
</trust-anchors>
</base-config>
<!-- <domain-config>-->
<!-- <domain includeSubdomains="true">test.xxx.net</domain>-->
<!-- <trust-anchors>-->
<!-- <certificates src="@raw/charles_certificate"/>-->
<!-- </trust-anchors>-->
<!-- </domain-config>-->
</network-security-config>
这里有几个要注意的地方:
- 证书的名称不能有大写字母、中横线等,这应该是android规定的。
- 证书只用写名称就好了,不用写后缀,可以用pem格式,也可以用cer格式。
- 最开始用的是下面注释掉的代码,发现不行,不知道哪里出错了,最后改成上面的,就可以了。
证书的问题解决了,那顺便把配置也简单记录一下吧
抓包配置
1、Charles配置
1.1、查看本地代理IP
1.2、代理配置
在菜单栏Proxy->Proxy Settings,这里可以查看代理端口
1.3、SSL代理配置
这里主要用于配置SSL的信息,这里也可以用通配符
2、模拟器配置
电脑端设置好以后,还需要在模拟其上设置代理。具体为
1、Settings
2、Network & internet
3、Wi-Fi
4、AndroidWifi
5、点击右上角修改按钮
6、将代理方式修改为手动,并填入ip地址和端口号,最后点击保存即可