11. Charles工具的使用
2024年10月28日大约 4 分钟
11. Charles工具的使用
- 能使用Charles抓取APP的包
- 能使用Charles完成APP弱网测试
1. 工具介绍
- 工具介绍Charles是一款在Mac下常用的数据包截取工具,在做移动开发时,为了调试移动端与服务端的网络通讯协议,常常需要截取网络数据包来进行分析。抓包的原理
- 下载安装
2. 工具使用(APP抓包)
- 手机和电脑保持同一网段(连接同一个WiFi)
- Charles设置代理
- 手机安装证书
- Charles确认连接
3. Charles设置代理
- Proxy -> Proxy Sting -> 修改端口号 -> 查看电脑IP(ipconfig)
3. 手机安装证书
- 点击Charles菜单栏Help -> SSL Proxying -> install Charles Root Certificates on a Mobile Device or Remote Browser, 可以看到手机端安装证书提示
根据以上提示,打开手机的WiFi设置,连接和电脑同一个WiFi【或者连接电脑开启的热点】,设置代理IP与端口(代理IP就是电脑的IP,端口就是Charles的代理端口8888);
手机浏览器访问网页,输入chls.pro/ssl,出现证书安装页面;
如果是苹果手机打开 设置 > 会出现 已下载的描述文件 > 点击安装
如果是苹果手机,点击安装后完成,在设置 -> 通用 -> 关于手机,信任证书如下图一:
如果是Android手机,点击下载,然后在手机设置的安全里面,安装证书如下图二:
Android从7.0开始系统不再信任用户CA证书(应用targetSdkVersion >= 24时生效,如果targetSdkVersion < 24即使系统是7.0+依然会信任)。也就是说即使安装了用户CA证书,在Android 7.0+的机器上,targetSdkVersion >= 24的应用的HTTPS包就抓不到了。 开发人员配置debug:AndroidManifest中配置networkSecurityConfig,App信任用户CA证书,让系统对用户CA证书的校验给予通过。
Charles 允许连接
手机设置好后,Charles页面会弹出以下信息,点击“Allow”
4. 工具使用(APP弱网测试)
弱网测试方法
- SIM卡网络切换
- 实际弱网场景测试(地铁、电梯、停车场)
- 使用软件进行网络代理(Charles)
- 保证抓包成功(参考抓包教程)
- Charles打开弱网设置配置项
- 设置带宽值
Charles打开弱网设置配置项
- 路径:Proxy -> Throttle Settings
- 设置带宽值
- 弱网、2G、3G的上下行速率如下:
5. 抓取HTTPS
6. 拓展阅读
1. Charles手机抓包
2. Charles工具使用
Charles Android 抓包失败SSLHandshake: Received fatal alert: certificate_unknown
前提:
Android使用Charles抓取Https请求的报文时,Android和Charles都正确安装了证书之后出现抓包失败,报错SSLHandshake: Received fatal alert: certificate_unknown,如下图所示:
原因:
安卓7之后调整了安全策略会导致部分手机抓包失败,请参考此链接:https://android-developers.googleblog.com/2016/07/changes-to-trusted-certificate.html
文中提到默认情况下,针对API Level 24及更高版本的应用程序不再信任用户或管理员添加的CA用于安全连接。意思就是就算你在手机上安装了受信任的证书也是没卵用的。
解决办法 一:
前提你的手机上已经正确安装了Charles证书:
在你的AndroidManifest.xml文件中添加如下配置:
<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
<application android:networkSecurityConfig="@xml/network_security_config"
... >
...
</application>
</manifest>
在res目录下新建一个xml文件夹,之后在res/xml/路径下新建文件network_security_config.xml
res/xml/network_security_config.xml:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config>
<domain includeSubdomains="true">你要抓取的域名</domain>
<trust-anchors>
<certificates src="user"/> //信任用户自己安装的证书
</trust-anchors>
</domain-config>
</network-security-config>
解决办法 二:
手机上是否有装证书都可以使用下面的方法:
在你的AndroidManifest.xml文件中添加如下配置:
<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
<application android:networkSecurityConfig="@xml/network_security_config"
... >
...
</application>
</manifest>
在res目录下新建一个xml文件夹,之后在res/xml/路径下新建文件network_security_config.xml
res/xml/network_security_config.xml:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config>
<domain includeSubdomains="true">你要抓取的域名</domain>
<trust-anchors>
<certificates src="@raw/证书文件名"/>
</trust-anchors>
</domain-config>
</network-security-config>
在res目录下新建一个raw文件夹,将手机上安装的证书文件放入res/raw/目录下,证书格式:pem,ca等(chales的话就是将你在手机浏览器打开http://charlesproxy.com/getssl下载的证书放入即可),步骤2中的证书文件名,就是你放入res/raw/目录下文件的名字
配置完重新运行项目,就可以看到报文了!