End

Charles 简介 总结 HTTP 抓包 代理

本文地址


目录

Charles 简介

Charles 是一个支持多平台的 HTTP 代理器、HTTP 监控、反向代理器。它能够让开发者查看本地机器与互联网之间的所有 HTTP 以及 SSL/HTTPS 传输数据。包括请求数据、响应数据 以及 HTTP 头部信息(包括 Cookie 和缓存信息)。

Charles 通过过将自己设置成系统(电脑或者浏览器)的网络访问代理服务器,然后截取请求和请求结果达到分析抓包的目的。

Charles的主要功能:

  • 支持SSL代理。可以截取分析SSL的请求。
  • 可以模拟慢速网络,以及等待时间(latency)较长的请求。
  • 支持重发网络请求,方便后端调试。
  • 支持修改网络请求参数。
  • 支持网络请求的截获和动态修改。
  • 支持端口映射。
  • 支持反向代理。
  • 支持SOCKS。

入门

视图模式

Charles支持两种模式,Structure和Sequence,其特点分别如下:

  • Structure:按照不同hosts域名分组展示请求。点击+之后便可以展开该 host 域名下的所有请求,可以很清晰的看到请求的数据结构。适合对单一系列的访问请求从宏观上进行把握,可以快速定位。
  • Sequence:可以看到全部请求,不用一层一层的去点开,这里是以数据请求的顺序去显示的。适合精确定位内容,因为每条 sequence 都有size、status等属性信息,方便快速定位这条结果的价值。

工具栏

  • 清除会话记录:点击之后可清除抓取到的所有请求
  • 开始/停止抓取会话记录:红色说明正在抓取请求,灰色说明目前不在抓取请求状态
  • 开始/停止SSL代理:是否启用SSL代理,锁打开状态代表开启、锁关闭状态代表停止
  • 开启/停止限流:灰色乌龟是网速设置正常,绿色乌龟指慢速网速开启了
  • 开启/关闭断点:灰色说明断点未开启,红色说明在使用断点
  • 编辑会话:点击之后可以修改请求的内容,修改后可执行此请求
  • 重新发一遍请求:先选定某一请求,点击该图标则请求会被再次发送该请求
  • 验证响应
  • 工具:各种常用工具的快捷入口
  • 配置:各种常用设置的快捷入口

内容区域

概览

  • Overview:【重要】会展示该请求的一个大体情况,例如:请求头、请求开始时间、响应大小、自己的notes等
  • content:【重要】请求和响应的详细内容,配合下面的导航栏进行查看
  • summary:展示一个该请求的大体资源分布情况,例如:服务器响应了多长时间,host是什么等等
  • chart:以表格形式告诉我们一个响应时间的分布情况
  • notes:点击之后自己可以对该请求记录一些东西,方便后续查看该接口的用途,可在overview中查看;map等操作后会自动添加相应的notes信息

request/response

  • header :详细的请求/响应头信息
  • query string :以表格形式展示请求时携带的查询参数
  • cookies :以表格的形式展示请求中的 Cookie 信息
  • raw :完整的原始请求/响应的【原始信息】
  • hex、compressed :以十六进制、压缩形式显示响应体,一般不予查看
  • text :以文本形式显示请求/响应体
  • JavaScript、json、json text:以json形式显示请求/响应体

常用功能

重复请求 Repeat

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

我们在想打压的网络请求上右击,然后选择Advanced Repeat菜单项,接着我们就可以在弹出的对话框中,选择打压的并发线程数 concurrency打压次数 iterations重复间隔 Repeat delay,确定之后,即可开始打压。

查找功能 Find

通过Edit -> Find或使用快捷键 ctrl+F 即可打开查找面板。

支持通配符和正则表达式,支持选择查找范围(所有Session、指定Path),支持自定义查找类别(url、header、body),双击查找结果会跳到想要的结果

监控过滤 Recording Settings

可以对网络请求进行过滤,只监控向指定服务器发送的请求。

Proxy -> Recording Settings 中可以设置网络包的过滤选项,过滤选项中有 Include 和 Exclude 两种选项,只有当 Include 为空时,Exclude 中的设置才会生效。过滤条件支持通配符。

Include:Only requests that match one of the locations below will be recorded. If this list is empty , all requests will be recorded unless otherwise excluded. 除非另有排除。

仅关注指定请求 Focus

使用 Focus 功能指定想要查看的域名,可以避免这个域名相关的请求淹没在茫茫请求当中。

对想要Focus的域名,右键菜单-选择Focus,这个域名就会添加到Focused列表,可以在 View -> Focused Hosts 组织所有想要Focus的列表

  • 在Structure模式下,不在Focus列表中的请求会被折叠起来
  • 在Sequence模式下,可以通过勾选Focused复选框隐藏不在Focus列表中的请求

模拟网络限速 Throttle

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

在Charles的菜单上,选择 Proxy -> Throttle Setting 项,在之后弹出的对话框中,我们可以勾选上Enable Throttling,然后设置 Throttle Preset(限流预值) 等。

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

也可以通过点击工具栏上小乌龟的图标开启或停止限流。

构造和修改请求 Compose

点击Compose按钮就可以构造一个自定义的请求,可以随便添加 Headers 或者query等参数,然后点击Execute就可以得到想要的报文了。

在网络请求上单击右键,选择Compose,可创建一个基于原始请求但可编辑的网络请求。可以修改该请求的任何信息,包括URL、端口,参数等。修改完后,单击Execute按钮,即可发送修改后的网络请求。

设置断点 Breakpoints

Intercept and edit requests and responses before they are sent and received

和我们在 IDE 上设置断点一样,在断点处会进入调试模式,请求会暂时中断,这时我们可以进行一些自定义的操作。

首先点击菜单中的图标或Proxy -> Breakpoint Settings -> Enable Breakpoints开启断点功能,然后再到想要设置断点的请求上,右键Breakpoints设置一个断点即可开启此请求的断点。

我们可以在Proxy-> Breakpoints Settings查看这个断点是否加入到断点设置面板,设置断点后默认是同时拦截请求和响应,更多内容可以双击设置。

设置完成后,Charles在遇到此请求时会弹出中断对话框。在中断对话框中,用户可以点击 Edit Request 来编辑请求的内容,编辑完成后点击 Execute 发出去这个请求给服务端。

发出请求后,断点再一次生效,不过这次是拦截了响应,同样,我们可以在响应返回到客户端之前根据需要修改响应报文。

需要注意一点:数据被拦截后,客户端的请求超时时长是不会停止计算的,如果没在设置的超时时间内返回数据,本次请求也就按失败处理了。

详细步骤参考这篇文章

重写功能 Rewrite

Rewrite 可以通过正则表达式匹配并添加、修改、删除请求或响应中的头部header参数、主体内容、请求参数、响应状态、Host/Path/URL。功能非常强大、配置也非常简单。

首先在菜单栏找到Tools-Rewrite..打开设置面板,然后点击Enable Rewrite启用重写功能,然后点击Add添加匹配项,然后添加匹配域名、匹配规则等。

基本支持所有Header、Host、Path、URL、Query Param、Response Status、Body等信息的增删改,支持正则表达式。

Tips:

  • 只支持字符串修改,而无法针对语义修改,例如不能修改json中某一key的值,只能在已知此key的值的情况下替换此值。
  • Rewrite 一般用来修改Header、响应码等方便一些,用来修改 Body 的话用 Map 功能更方便一些
  • 可以针对特定的标签做一些操作,例如针对</html>注入Script脚本

黑白名单 Block/Allow List

即以前的Black/Write List

可以在一个请求上右键选择Block List/Allow List添加到黑白名单,可以在Toos -> Block List/Allow List下统一更改。

黑名单开启后,黑名单中的域名不能联网(或返回403);白名单开启后,只有白名单中的网络可以访问网络,不在白名单中的不能访问网络(或返回403)。

HTTP 抓包

HTTP 抓包原理

当你使用代理服务器后,所有的 HTTP 请求,都是先发到代理服务器,然后由代理服务器重新包装后,再发给目标服务器;响应也是如此,代理服务器先接收来自目标服务器的响应,然后包装后发给客户端,从而在代理服务器上可以实现抓包。

Windows、Mac 上抓包

要想抓取 Windows(Mac OS X) 上的网络包,首先必须在Charles菜单栏上选择Proxy - Windows(Mac OS X) Proxy开启代理功能,使得请求转给 Charles 代理。

代理相关的设置可以在菜单栏Proxy-Proxy Setting..中找到,里面可以设置代理端口(默认8888)、代理模式(HTTP代理或Socks代理)等信息。注意勾选 Enable transparent透明 Http proxying(不知道有什么用)。

Android、iOS 上抓包

打开 Android 设置 - WLAN,将手机网络连接到与电脑相同WiFi,点击 WiFi 详情按钮,将 HTTP 代理改为手动,代理服务器主机名、端口号填写 Charles 上的配置,端口号默认为8888。点击返回,设置成功。

当手机连接上代理后并有网络请求时,Charles 会弹出请求连接的确认提示框,点击Allow即可完成设置

查看Charles所在电脑的代理IP地址和端口号方法:点击 Help -> SSL Proxying -> Install Charles Root Certificate on a Mobile Device

HTTPS 抓包

完成上述配置即可以对 Windows、Android 上发送的HTTP请求进行抓包。但由于 Chrles 属于代理服务器,缺少SSL证书,无法对HTTPS请求进行抓包,还需安装 Charles 证书。

HTTPS 抓包原理

原理解释

Charles can be used as a man-in-the-middle中间人 HTTPS proxy, enabling you to view in plain text the communication between web browser and SSL web server.

Charles does this by becoming a man-in-the-middle. Instead of代替 your browser seeing the server’s certificate, Charles dynamically generates a certificate for the server and signs it with its own root certificate (the Charles CA Certificate). Charles receives the server’s certificate, while your browser receives Charles’s certificate. Therefore因此 you will see a security warning, indicating指示 that the root authority权威 is not trusted. If you add the Charles CA Certificate to your trusted certificates you will no longer see any warnings – see below for how to do this.


转译

Charles 作为一个中间人代理,当客户端(例如浏览器、移动APP)和服务器通信时,Charles 接收服务器返回给客户端的证书,并返回给客户端一个动态生成的、使用自己根证书签名的证书。然后,Charles 接收了服务器的证书并和服务器之间建立了 HTTPS 连接,而客户端接收到的是 Charles 生成的证书,客户端仅和 Charles 之间建立了 HTTPS 连接。

也就是说,Charles 作为中间代理在客户端和服务器之间通信,所以通信的数据可以被 Charles 拦截并解密。

但是,由于 Charles 更改了证书,如果客户端校验 Charles 的证书不通过会给出安全警告,所以需要客户端将 Charles 的证书添加到受信任的证书中后才能进行正常通信。


HTTPS 通信过程

  • 客户端将自己支持的加密算法发送给服务器,请求服务器证书
  • 服务器选取一组加密算法,并将证书返回给客户端
  • 客户端校验证书合法性,生成随机对称密钥用公钥加密后发送给服务器
  • 服务器用私钥解密出对称密钥,返回一个响应,HTTPS连接建立完成
  • 随后双方通过这个对称密钥进行安全的数据通信

启用 SSL 代理

因为 Charles 默认不监听 HTTPS 请求,所以还需要先启用 SSL 代理并配置 Include 列表才能正常使用。

  • 点击 Proxy -> SSL Proxying Settings -> 勾选上 Enable SSL Proxying
  • 点击 Include 区域中的 Add Host 填写需要代理的域名及端口号,支持通配符*,如果域名及端口号都是*,则会代理所有的 SSL 请求
  • 也可以在 Exclude 区域中添加排除列表

Charles can show you the plain text contents of SSL requests and response. Only sites matching the locations listed below will be proxied.

Windows、Mac 上抓包

现在,只需在 Windows、Mac 上安装 Charles 证书即可对HTTPS请求进行抓包。

菜单栏找到 Help - SSL Proxying - Install Charles Root Certificate ,点击安装证书会提示"此CA根目录证书不受信任",根据向导继续安装即可。

Android、iOS 上抓包

同样,如果需要抓取手机的 HTTPS 请求,还需要在手机上安装相应证书。

方式一

Android上这种方式经常不成功,如果有root权限的话建议直接使用下面第二种方式!

1、点击 Help -> SSL Proxying -> Install Charles Root Certificate on a Mobile Device会出现一个弹窗,提示你:

Configure your device to use Charles as its HTTP proxy on *.*.*.*:8888, then browse to chls.pro/ssl to download and istall the Certificate

2、然后在手机浏览器输入地址 chls.pro/ssl,出现证书下载页面,点击下载。

有的浏览器下载后无法安装,比如小米浏览器,可以换其他浏览器试试;也可通过 PC 下载,下载后导入到手机中

3、然后安装此证书

  • 如果直接点击crt文件不能安装,可以通过下面方法安装:设置——WiFi——高级设置——安装证书,或设置—更多设置—系统安全—加密与凭据—从存储设备安装证书,安装过程中的证书名称随便输入,凭据用途默认VPN和应用
  • 如果还不成功,尝试将 .pem 改成 .crt 格式,再次点击安装
  • 如果还不行,点击一键清除凭据、取消 HTTP 代理,然后按上面的步骤重新搞搞

方式二(需要root权限)

1、打 Help -> SSL Proxying -> Save Charles Root Certificat -> 输入文件名,文件格式默认.pem格式,完成后会在指定目录生成一个类似bqt.pem的文件

2、通过以下命令获取证书在安卓系统中的文件名,执行后会生成一个类似1ac7b872的名称

openssl x509 -subject_hash_old -in bqt.pem

3、将bqt.pem重命名为1f631c40.0,必须以.0格式结尾

4、将1ac7b872.0证书 push 到手机adb push 1ac7b872.0 /system/etc/security/cacerts/目录中,或者可以打开 AS 的devices file explorer手动导入

注意:只有 root 过的手机才能通过 push 命令向此目录导入文件,push 成功后可能徐亚重启手机才能生效

重定向 Map

响应重定向 Map local

将指定请求的响应重定向到本地的文件内容作为最终的响应,设置后,当 Charles 捕获到这个请求,不管是40X、还是50X,都会指向本地的文件(一般是一个json)。

Tools -> Map local -> 勾选Enable选项 -> 点击 Add 添加需要重定向的请求,配置 Map FromMap To

也可以在会话列表中右击需要重定向的请求 -> 点击 Map local -> 将会自动带入需要重定向的链接(Map from),选择本地需要被重定向到的目标文件(Map to),点击OK即可。

注意:

  • 如果要同时 map 一个 path 和他的子 path,需以 * 结尾
  • 如果请求 Query 是动态变化的,比如 Query 里面有请求时间,则需要把 Query 置为空或*(也可以通过正则匹配)
  • 如果不需要指定某些项,比如端口 port、path,可以置为空

请求重定向 Map remote

当请求链接 url1 时,将请求重定向到另一个链接 url2,将 url2 的返回值当做 url1 的返回值返回给 url1。

Tools -> Map Remote -> 勾选Enable选项 -> 点击 Add 添加需要重定向的请求

同样可以在会话列表右击需要重定向的请求 -> 点击Map Remote -> 将会自动带入需要重定向的链接(Map from),配置好实际请求的链接(Map to),点击OK即可

2019-10-29

posted @ 2019-10-29 10:07  白乾涛  阅读(1635)  评论(1编辑  收藏  举报