Charles 抓包分析

Posted by Puqin Chen on 2018-03-30

Charles 是在Mac下常用的截取网络封包的工具,在做iOS开发时,我们为了调试与服务器端的网络通讯协议,常常需要截取网络封包来分析。Charles通过将自己设置成系统的网络访问代理服务器,使得所有的网络访问请求都通过它来完成,从而实现了网络封包的截取和分析。

使用 Charles 抓包的过程

http 抓包

对于 mac
在 mac 下进行 http 抓包,非常简单,只要打开 Charles 设置代理以后,就可以抓取 Mac 上的网络请求了。
image

对于 iOS 设备:

  1. 在 Mac 中打开Charles 应用
  2. 设置手机 HTTP 代理:确保移动设备与 Mac 笔记本在同一局域网内,添加代理 ip地址(Mac内网地址)和端口号(8888)
  3. 在 iOS 设备上访问接口数据,在 Charles 弹出的确认窗口中选择 Allow,允许即可。

https 抓包

对于 mac

  1. 安装 Charles 证书:浏览器访问地址 http://www.charlesproxy.com/getssl ,浏览器会下载证书并提示安装
  2. 安装完成后,在 Charles 中选择需要代理地址,选中 Enable SSL Proxying,这样就可以抓取 HTTPS 数据包

对于 iOS

  1. 在 设置好手机 http 代理的前提下, 安装 SSL 证书到手机设备,点击 Help -> SSL Proxying -> Install Charles Root Certificate on a Mobile Device
  2. 出现弹窗得到地址 chls.pro/ssl ,然后在手机浏览器上输入地址 chls.pro/ssl ,出现证书安装页面,点击安装手机设置有密码的输入密码进行安装
    image
  3. Charless 设置 Proxy,进行 Proxy-> SSL Proxying Settings ,勾选 Enable SSL proxying,点击 Add,设置要抓取的https接口
  4. 进行 Https 抓包

注; 有些 app 对接口内容进行了加密,看到的还是一堆乱码

Charles 抓包原理

Charles 本身就是一个协议代理工具,如果只是普通的HTTP请求,因为数据本身没有经过再次加密,因此作为代理可以知道所有客户端发送到服务端的请求内容以及服务端返回给客户端的数据内容,这也就是抓包工具能够将数据传输内容直接展现出来的原因。

但是对于 HTTPS 请求,它发送的数据都进行了加密,代理如果什么都不做的话是无法获取到其中的内容的。为了实现这个过程的数据获取, Charles 需要做的事情是对客户端伪装成服务端,对服务端伪装成客户端,具体:

  • 截获真实客户端的HTTPS请求,伪装客户端向真实服务端发送HTTPS请求
  • 接受真实服务器响应,用Charles自己的证书伪装服务端向真实客户端发送数据内容

下图是整个过程:
image

具体步骤如下:

  1. 客户端向服务器发起 HTTPS 请求
  2. Charles 拦截客户端的请求,伪装成客户端向服务器进行请求
  3. 服务器向“客户端”(实际上是 Charles)返回服务器的CA证书
  4. Charles 拦截服务器的响应,获取服务器证书公钥,然后自己制作一张证书,将服务器证书替换后发送给客户端。(这一步,Charles拿到了服务器证书的公钥)
  5. 客户端接收到“服务器”(实际上是Charles)的证书后,生成一个对称密钥,用Charles的公钥加密,发送给“服务器”(Charles)
  6. Charles拦截客户端的响应,用自己的私钥解密对称密钥,然后用服务器证书公钥加密,发送给服务器。(这一步,Charles拿到了对称密钥)
  7. 服务器用自己的私钥解密对称密钥,向“客户端”(Charles)发送响应
  8. Charles拦截服务器的响应,替换成自己的证书后发送给客户端
  9. 至此,连接建立,Charles拿到了 服务器证书的公钥 和 客户端与服务器协商的对称密钥,之后就可以解密或者修改加密的报文了。

简单来说,就是Charles作为“中间人代理”,拿到了 服务器证书公钥 和 HTTPS连接的对称密钥,前提是客户端选择信任并安装Charles的CA证书,否则客户端就会“报警”并中止连接。