Charles 使用教程

782 阅读9分钟

Charles(v4.6.2)

简介

Charles 是在 Mac 下常用的网络封包截取工具,在做移动开发时,我们为了调试与服务器端的网络通讯协议,常常需要截取网络封包来分析。

Charles 通过将自己设置成系统的网络访问代理服务器,使得所有的网络访问请求都通过它来完成,从而实现了网络封包的截取和分析。

除了在做移动开发中调试端口外,Charles 也可以用于分析第三方应用的通讯协议。配合 Charles 的 SSL 功能,Charles 还可以分析 Https 协议。

Charles 主要的功能包括:

  1. 截取 Http 和 Https 网络封包;
  2. 支持重发网络请求,方便后端调试;
  3. 支持修改网络请求参数;
  4. 支持网络请求的截获并动态修改;
  5. 支持模拟慢速网络;

Charles 使用学习路线及重点

  • 将 Charles 设置成系统代理
  • Charles 主界面介绍
  • 过滤网络请求
  • 截取 iPhone 上的网络封包 (重点)
  • 截取 Https 通讯信息 (重点)
  • 模拟慢速网络
  • 修改网络请求内容
  • 给服务器做压力测试
  • 修改服务器返回内容
  • 总结

将 Charles 设置成系统代理

Charles 是通过将自己设置成代理服务器来完成封包截取的,所以使用 Charles 的第一步是将其设置成系统的代理服务器。

选择菜单中的“Proxy” –> “macOS Proxy”来将 Charles 设置成系统代理。如下所示:

macOS Proxy

之后,你就可以看到源源不断的网络请求出现在 Charles 的界面中。

注意: ChromeFirefox 浏览器默认并不使用系统的代理服务器设置,而 Charles 是通过将自己设置成代理服务器来完成封包截取的,所以在默认情况下无法截取 ChromeFirefox 浏览器的网络通讯内容。如果你需要截取的话,在 Chrome 中设置成使用系统的代理服务器设置即可,或者直接将代理服务器设置成 127.0.0.1:8888 也可达到相同效果。

Charles 主界面介绍

Charles 4.6.2

Charles 主要提供两种查看封包的视图,分别名为 StructureSequence

  • Structure 视图将网络请求 按访问的域名分类
  • Sequence: 视图将网络请求 按访问的时间排序

Tip: 请求多了有时会看不过来,可使用 Filter 功能,输入关键字来快速筛选出 URL 中带指定关键字的网络请求。

对于某个具体的网络请求,可以查看其详细的请求和响应内容。 如果请求的内容是 POST 的表单,Charles 会自动帮你将表单进行分项显示。如果响应内容是图片,那么 Charles 可以显示出图片的预览。

过滤网络请求

对网络请求进行过滤,只监控指定目录服务器上发送的请求。有以下几种办法:

  1. 主页面中 Filter 栏中填入需过滤出来的关键字(临时性);
  2. 选择菜单中的“Proxy” –> “Recording Settings”选择 Include栏,如下图一(经常性);
  3. 在想过滤的网络请求上右击,选择 Focus,之后勾选上 Focused,如下图二;

图一

图二

截取 iPhone 上的网络封包

Charles 上的设置

首先需将 Charles 的代理功能打开,选择菜单中的“Proxy” –> “Proxy Settings”填入代理端口8888,并且勾上 Enable transparent HTTP proxying,如下图:

Proxy Settings

iPhone 上的设置

首先需要获取 Charles 运行所在电脑的IP地址,选择菜单中的“Help” –> “Local IP Addresses”,如下图:

Local IP Addresses

在iPhone的“设置” –> “无线局域网”中,可看到当前连接的 wifi 名,点击右边的详情键,找到最底部「HTTP 代理」一项,我们将其切换成手动,然后填上 Charles 运行所在电脑的 IP,以及端口号 8888,如下图:

HTTP Proxy

设置好后,我们打开 iPhone 上的任意需要网络通讯的程序,就可以看到 Charles 弹出 iPhone 请求连接的确认菜单(如下图),点击 Allow即可完成设置。

Allow Connection from ……

截取 Https 通讯信息

安装证书

如需截取分析Https协议相关的内容。那么需要安装 Charles 的 CA证书。步骤如下:

首先需在 Mac 电脑上安装证书,选择菜单中的 “Help” –> “SSL Proxying” –> “Install Charles Root Certificate”,然后输入系统的账号密码,即可在 KeyChain看到添加好的证书。如下图:

安装 Charles CA 证书

需注意的是,即使安装完证书之后,Charles 默认也并不截取 Https 网络通讯的信息,如果你想截取某个网站上的所有 Https 网络请求,可以在该请求上右击,选择Enable SSL Proxying,这样对于该 Host 的所有 SSL 请求就可以被截取到了。如下图:

Enable SSL Proxying

截取移动设备中的 Https 通讯信息

如果我们需要在 iOSAndroid 设备上截取 Https 协议的通讯内容,还需在手机上安装相应的证书。选择菜单中的 “Help” –> “SSL Proxying” –> “Install Charles Root Certificate on a Mobile Device or Remote Browser”,然后就可以看到 Charles 弹出的简单的安装教程。如下图:

chls.pro/ssl

手机浏览器访问 chls.pro/ssl 安装完证书后,就可以截取手机上的 Https 通讯内容了。不过同样默认 Charles 并不做截取,你还需要在要截取的网络请求上右击,选择 Enable SSL Proxying

chls.pro/ssl 访问无效的问题

Not allowed GET http://chls.pro/ssl - connection dropped

选择菜单中的 “Tools” –> “Allow List” 记得不要勾选,在尝试:

Allow List

问题: SSL Proxying not enabled for this host: enable in Proxy Settings, SSL locations

Charles解析不出 path,我们就没法建立映射,解决如下图:

SSL Proxying Settings

问题: Enable SSL Proxying 中对应path无法访问网络

在手机设置中 “通用” –> “关于本机” –> “证书信任设置” 中找到 Charles Proxy CA 然后信任该证书即可:

Charles Proxy CA.PNG

模拟慢速网络

在做移动开发的时候,常常需要模拟慢速网络或者高延迟的网络,来测试应用的表现是否正常。Charles 对此需求提供了很好的支持。

在 Charles 的菜单上,选择“Proxy”–>“Throttle Settings”项,在弹出的对话框中,勾选上 Enable Throttling,并且可以设置 Throttle Present的类型,如下图:

Throttle Settings

如果只想模拟指定网站的慢速网络,可以再勾选上图中的 “Only for selected hosts” 项,然后在对话框的下半部分设置中增加指定的 hosts 项即可。

修改网络请求内容

修改数据有很多种方法,先介绍最简单的一种,Breakpoints

使用方法类似 Xcode 调试打的断点,当请求到这个接口的时候就会暂停到这里,我们就可以在断点时修改请求参数,给他继续执行的权限之后就会自动执行,如下:

Breakpoints

修改请求参数和数据 选择 Edit Request 可以编辑请求参数,请求网络类型可以随意修改,修改好之后点击 Execute 可以继续执行

Edit Request

给服务器做压力测试

我们可以使用 Charles 的 Repeat 功能来简单地测试服务器的并发处理能力,方法如下。

我们在想打压的网络请求上(POST 或 GET 请求均可)右击,然后选择 「Repeat Advanced」菜单项,如下图:

Repeat Advanced...

接着我们就可以在弹出的对话框中,选择打压的并发线程数以及打压次数,确定之后,即可开始打压。

Advanced Repeat

一些写得很弱的投票网站,也可以用这个办法来快速投票~ 略过一万字,请合法使用。

修改服务器返回内容

修改返回数据是很好的方法,这样不会被服务器得知,但是客户端 会以为我们修改后的数据就是服务器返回的数据。

同样也是勾选 Breakpoints,第一次捕获断点时候会让我们编辑请求数据,因为我们此时不需要修改请求数据,直接点 Exccute 继续执行,得到服务端的响应数据之后会再次捕获断点,此时我们就可以找到这个接口点击 Edit Response 编辑响应数据了

Edit Response

有些时候我们想让服务器返回一些指定的内容,方便我们调试一些特殊情况。例如列表页面为空的情况,数据异常的情况,部分耗时的网络请求超时的情况等。如果没有 Charles,要服务器配合构造相应的数据显得会比较麻烦。这个时候,使用 Charles 相关的功能就可以满足我们的需求。

根据具体的需求,Charles 提供了 Map 功能、 Rewrite 功能以及 Breakpoints 功能,都可以达到修改服务器返回内容的目的。这三者在功能上的差异是:

  1. Map 功能适合长期地将某一些请求重定向到另一个网络地址或本地文件;
  2. Rewrite 功能适合对网络请求进行一些正则替换;
  3. Breakpoints 功能适合做一些临时性的修改;

Map 功能

在 Charles 的菜单中,选择 “Tools”–>“Map Remote”“Map Local” 即可进入到相应功能的设置页面。

  • Map Remote 是将指定的网络请求重定向到另一个网址请求地址;
  • Map Local 是将指定的网络请求重定向到本地文件;

对于 Map Remote 功能,我们需要分别填写网络重定向的源地址和目的地址,对于不需要限制的条件,可以留空。下图是一个示例,我将所有 mpaasgw.tngdigital.com.my(测试服务器)的请求重定向到了 ww.tngdigital.com.my(线上服务器)

Edit Remote Mapping

对于 Map Local 功能,我们需要填写的重定向的源地址和本地的目标文件。对于有一些复杂的网络请求结果,我们可以先使用 Charles 提供的 “Save Response…” 功能,将请求结果保存到本地,然后稍加修改,成为我们的目标映射文件。

Edit Local Mapping

Rewrite 功能

image.png

image.png

Breakpoints 功能

请参考上面 Breakpoints 功能操作,需注意的是,使用 Breakpoints 功能将网络请求截获并修改过程中,整个网络请求的计时并不会暂停,所以长时间的暂停可能导致客户端的请求超时。

总结

Charles 作为中间代理可以修改请求数据和响应数据,用户端发送数据被 Charles 代理,此时 Charles 相对于用户端来说就是服务端,然后把代理的数据转发给服务端,此时 Charles 相对于服务端就是用户端