简介
Charles 是在 Mac 下常用的网络封包截取工具,在做移动开发时,我们为了调试与服务器端的网络通讯协议,常常需要截取网络封包来分析。
Charles 通过将自己设置成系统的网络访问代理服务器,使得所有的网络访问请求都通过它来完成,从而实现了网络封包的截取和分析。
除了在做移动开发中调试端口外,Charles 也可以用于分析第三方应用的通讯协议。配合 Charles 的 SSL 功能,Charles 还可以分析 Https 协议。
Charles 主要的功能包括:
- 截取 Http 和 Https 网络封包;
- 支持重发网络请求,方便后端调试;
- 支持修改网络请求参数;
- 支持网络请求的截获并动态修改;
- 支持模拟慢速网络;
Charles 使用学习路线及重点
- 将 Charles 设置成系统代理
- Charles 主界面介绍
- 过滤网络请求
- 截取 iPhone 上的网络封包 (重点)
- 截取 Https 通讯信息 (重点)
- 模拟慢速网络
- 修改网络请求内容
- 给服务器做压力测试
- 修改服务器返回内容
- 总结
将 Charles 设置成系统代理
Charles 是通过将自己设置成代理服务器来完成封包截取的,所以使用 Charles 的第一步是将其设置成系统的代理服务器。
选择菜单中的“Proxy” –> “macOS Proxy”来将 Charles 设置成系统代理。如下所示:
之后,你就可以看到源源不断的网络请求出现在 Charles 的界面中。
注意:
Chrome和Firefox浏览器默认并不使用系统的代理服务器设置,而 Charles 是通过将自己设置成代理服务器来完成封包截取的,所以在默认情况下无法截取Chrome和Firefox浏览器的网络通讯内容。如果你需要截取的话,在Chrome中设置成使用系统的代理服务器设置即可,或者直接将代理服务器设置成127.0.0.1:8888也可达到相同效果。
Charles 主界面介绍
Charles 主要提供两种查看封包的视图,分别名为 Structure 和 Sequence。
Structure视图将网络请求 按访问的域名分类;Sequence: 视图将网络请求 按访问的时间排序;
Tip: 请求多了有时会看不过来,可使用
Filter功能,输入关键字来快速筛选出 URL 中带指定关键字的网络请求。对于某个具体的网络请求,可以查看其详细的请求和响应内容。 如果请求的内容是
POST的表单,Charles 会自动帮你将表单进行分项显示。如果响应内容是图片,那么 Charles 可以显示出图片的预览。
过滤网络请求
对网络请求进行过滤,只监控指定目录服务器上发送的请求。有以下几种办法:
- 主页面中
Filter栏中填入需过滤出来的关键字(临时性); - 选择菜单中的
“Proxy” –> “Recording Settings”选择Include栏,如下图一(经常性); - 在想过滤的网络请求上右击,选择
Focus,之后勾选上Focused,如下图二;
截取 iPhone 上的网络封包
Charles 上的设置
首先需将 Charles 的代理功能打开,选择菜单中的“Proxy” –> “Proxy Settings”填入代理端口8888,并且勾上 Enable transparent HTTP proxying,如下图:
iPhone 上的设置
首先需要获取 Charles 运行所在电脑的IP地址,选择菜单中的“Help” –> “Local IP Addresses”,如下图:
在iPhone的“设置” –> “无线局域网”中,可看到当前连接的 wifi 名,点击右边的详情键,找到最底部「HTTP 代理」一项,我们将其切换成手动,然后填上 Charles 运行所在电脑的 IP,以及端口号 8888,如下图:
设置好后,我们打开 iPhone 上的任意需要网络通讯的程序,就可以看到 Charles 弹出 iPhone 请求连接的确认菜单(如下图),点击 Allow即可完成设置。
截取 Https 通讯信息
安装证书
如需截取分析Https协议相关的内容。那么需要安装 Charles 的 CA证书。步骤如下:
首先需在 Mac 电脑上安装证书,选择菜单中的 “Help” –> “SSL Proxying” –> “Install Charles Root Certificate”,然后输入系统的账号密码,即可在 KeyChain看到添加好的证书。如下图:
需注意的是,即使安装完证书之后,Charles 默认也并不截取 Https 网络通讯的信息,如果你想截取某个网站上的所有 Https 网络请求,可以在该请求上右击,选择Enable SSL Proxying,这样对于该 Host 的所有 SSL 请求就可以被截取到了。如下图:
截取移动设备中的 Https 通讯信息
如果我们需要在 iOS 或 Android 设备上截取 Https 协议的通讯内容,还需在手机上安装相应的证书。选择菜单中的 “Help” –> “SSL Proxying” –> “Install Charles Root Certificate on a Mobile Device or Remote Browser”,然后就可以看到 Charles 弹出的简单的安装教程。如下图:
手机浏览器访问 chls.pro/ssl 安装完证书后,就可以截取手机上的 Https 通讯内容了。不过同样默认 Charles 并不做截取,你还需要在要截取的网络请求上右击,选择 Enable SSL Proxying。
chls.pro/ssl 访问无效的问题
选择菜单中的 “Tools” –> “Allow List” 记得不要勾选,在尝试:
问题: SSL Proxying not enabled for this host: enable in Proxy Settings, SSL locations
Charles解析不出 path,我们就没法建立映射,解决如下图:
问题: Enable SSL Proxying 中对应path无法访问网络
在手机设置中 “通用” –> “关于本机” –> “证书信任设置” 中找到 Charles Proxy CA 然后信任该证书即可:
模拟慢速网络
在做移动开发的时候,常常需要模拟慢速网络或者高延迟的网络,来测试应用的表现是否正常。Charles 对此需求提供了很好的支持。
在 Charles 的菜单上,选择“Proxy”–>“Throttle Settings”项,在弹出的对话框中,勾选上 Enable Throttling,并且可以设置 Throttle Present的类型,如下图:
如果只想模拟指定网站的慢速网络,可以再勾选上图中的 “Only for selected hosts” 项,然后在对话框的下半部分设置中增加指定的 hosts 项即可。
修改网络请求内容
修改数据有很多种方法,先介绍最简单的一种,Breakpoints
使用方法类似 Xcode 调试打的断点,当请求到这个接口的时候就会暂停到这里,我们就可以在断点时修改请求参数,给他继续执行的权限之后就会自动执行,如下:
修改请求参数和数据 选择 Edit Request 可以编辑请求参数,请求网络类型可以随意修改,修改好之后点击 Execute 可以继续执行
给服务器做压力测试
我们可以使用 Charles 的 Repeat 功能来简单地测试服务器的并发处理能力,方法如下。
我们在想打压的网络请求上(POST 或 GET 请求均可)右击,然后选择 「Repeat Advanced」菜单项,如下图:
接着我们就可以在弹出的对话框中,选择打压的并发线程数以及打压次数,确定之后,即可开始打压。
一些写得很弱的投票网站,也可以用这个办法来快速投票~ 略过一万字,请合法使用。
修改服务器返回内容
修改返回数据是很好的方法,这样不会被服务器得知,但是客户端 会以为我们修改后的数据就是服务器返回的数据。
同样也是勾选 Breakpoints,第一次捕获断点时候会让我们编辑请求数据,因为我们此时不需要修改请求数据,直接点 Exccute 继续执行,得到服务端的响应数据之后会再次捕获断点,此时我们就可以找到这个接口点击 Edit Response 编辑响应数据了
有些时候我们想让服务器返回一些指定的内容,方便我们调试一些特殊情况。例如列表页面为空的情况,数据异常的情况,部分耗时的网络请求超时的情况等。如果没有 Charles,要服务器配合构造相应的数据显得会比较麻烦。这个时候,使用 Charles 相关的功能就可以满足我们的需求。
根据具体的需求,Charles 提供了 Map 功能、 Rewrite 功能以及 Breakpoints 功能,都可以达到修改服务器返回内容的目的。这三者在功能上的差异是:
Map功能适合长期地将某一些请求重定向到另一个网络地址或本地文件;Rewrite功能适合对网络请求进行一些正则替换;Breakpoints功能适合做一些临时性的修改;
Map 功能
在 Charles 的菜单中,选择 “Tools”–>“Map Remote” 或 “Map Local” 即可进入到相应功能的设置页面。
- Map Remote 是将指定的网络请求重定向到另一个网址请求地址;
- Map Local 是将指定的网络请求重定向到本地文件;
对于 Map Remote 功能,我们需要分别填写网络重定向的源地址和目的地址,对于不需要限制的条件,可以留空。下图是一个示例,我将所有 mpaasgw.tngdigital.com.my(测试服务器)的请求重定向到了 ww.tngdigital.com.my(线上服务器)
对于 Map Local 功能,我们需要填写的重定向的源地址和本地的目标文件。对于有一些复杂的网络请求结果,我们可以先使用 Charles 提供的 “Save Response…” 功能,将请求结果保存到本地,然后稍加修改,成为我们的目标映射文件。
Rewrite 功能
Breakpoints 功能
请参考上面 Breakpoints 功能操作,需注意的是,使用 Breakpoints 功能将网络请求截获并修改过程中,整个网络请求的计时并不会暂停,所以长时间的暂停可能导致客户端的请求超时。
总结
Charles 作为中间代理可以修改请求数据和响应数据,用户端发送数据被 Charles 代理,此时 Charles 相对于用户端来说就是服务端,然后把代理的数据转发给服务端,此时 Charles 相对于服务端就是用户端