在做开发时,为了调试与服务器端的网络通讯协议,常常需要截取网络数据包来分析。不管是移动开发者还是测试者,抓包工具对于我们的工作都是非常有帮助的,本文将简单介绍 Charles 抓包工具的使用。
Charles 不仅可以帮助我们抓取服务器返回的数据,还可以修改请求参数,修改响应体。基本上 HTTP 能修改的东西,Charles 都能帮我们修改。
一、准备工作
首先需要在官网下载 Charles,下载并安装,Charles 是付费软件,当然你也可以“免费”使用。
当你打开软件后,就已经在开始抓包了,默认是获取当前电脑的网络请求包。如果不想抓当前电脑的包,可以取消勾选。
接下来,让你的电脑和手机连接同一WiFi,必须是同一WiFi。否则无法获取手机的数据包。
二、抓取手机 HTTP 请求数据包
- 首先查看电脑IP,Help→Local IP Address
这里我电脑 IP 为 192.168.191.3
,记住这个 IP 地址,需要填在手机中,我的手机是 iPhone,接下来以 iPhone 为例,安卓手机类似。
- 设置手机HTTP代理
打开手机,点击 “设置->无线局域网->你已经连接的WiFi”,设置 HTTP 代理,注意手机和电脑必须连接同一WiFi。
将上述电脑 IP 填入手机的 HTTP 代理中,这里我电脑 IP 为 192.168.191.3
,所以我就填这个,需要根据自己电脑实际IP填写。
端口填写 8888,这个端口号需要和 Charles 的代理端口号相同,默认是 8888,通过 Charles 菜单栏的 “代理—>代理设置”,查看端口号,并勾选 “Enable transparent HTTP proxying”。
设置好之后,电脑会弹框,询问是否允许代理,点击“允许”即可。
当点击“允许”后,手机的网络请求,将通过 Charles 代理转发。也就是说,当手机请求数据时,实际是把请求发给了 Charles,Charles 再去请求服务器;当服务器返回数据时,也是把数据返回给了 Charles,Charles 再把数据给手机,这样 Charles 就可以获取这中间的网络请求了。
现在已经可以抓取 HTTP 的请求数据了,但还无法获取 HTTPS 的请求。
这是因为 HTTP 都是明文传输,请求数据一目了然,但 HTTPS 是经过加密处理。为了数据安全,大部分网络请求都已经是 HTTPS 的,虽然可以截获数据包,但加密的内容展示出来是乱码,所以暂时还看不到数据内容。
接下来,在上述基础上,继续对 HTTPS 协议进行抓包。
三、抓取 HTTPS 数据
- 下载证书到手机
在手机 Safari 浏览器输入地址 chls.pro/ssl
,出现证书安装页面,点击安装,手机设置有密码的输入密码进行安装。
当安装完成后,还需要在“设置→通用→关于本机→证书信任设置”里面启用完全信任 Charles 证书,打开信任正式按钮。
- SSL 代理设置
通过 Charles 菜单栏的 “Proxy -> SSL Proxying Settings” 打开 SSL 代理设置。勾选 Enable SSL Proxying,点击 Add,添加需要代理的 IP。
填写 *
,表示代理所有 IP 和端口。也可以根据实际需求,填写具体的 Host 或者 Port,这样就只会抓取你填写指定的数据包。
完成~~已经可以获取 HTTPS 的数据了。
四、Charles 抓包原理
HTTPS 不是经过加密安全的通信协议吗?Charles 是如何抓取 HTTPS 的数据包呢?
我们都知道 HTTPS 在保证数据安全传输上使用了加密算法,但是具体是如何加密的?
实际上 SSL/TLS 协议的基本思路是非对称加密和对称加密结合来传输数据。
简单的说 (虽然不准确):HTTPS 是通过一次非对称加密算法 (如RSA算法) 进行密钥的生成与交换,在后续通信过程中,就使用该密钥进行对称加密通信。
之所以使用两种加密方式的原因在于,非对称加密虽然更安全,但计算量较大,如果一直使用非对称加密来传输数据的话,会影响效率。所以先使用一次非对称加密,确保秘钥的安全,之后使用速度更快的对称加密进行通信,这样既保证了通信效率,又保证了安全。
同时,为防止中间人截取替换第一次非对称加密使用的公钥,还引入第三方,一个权威的证书颁发机构(CA)来解决。
所以实际上服务端返回给客户端并不是公钥,而是申请的证书。各浏览器和操作系统已经维护了所有权威证书机构的名称和公钥。所以客户端只需要知道是哪个机构颁布的证书,就可以从本地找到对应的机构公钥,解密出证书签名。
那 Charles 是如何获取 HTTPS 的数据呢?
Charles 的主要工作原理就是:对客户端伪装成服务器,对服务器伪装成客户端。
关键在于下载 Charles 的证书并信任。Charles 作为“中间人代理”,拿到了 服务器证书公钥 和 HTTPS 连接的对称密钥,前提是客户端选择信任并安装 Charles 的 CA 证书,否则客户端就会“报警”并中止连接,所以 HTTPS 还是很安全的。