charles配置
charles常用场景

关于Charles


在之前的文章介绍过fiddler的使用,但由于fiddler跨平台支持不是很好(也有跨平台的fiddler everywhere,但并功能并不强大)。
因此这里来介绍一款功能强大,且支持多平台的一款代理工具神器——charles(青花瓷)

本篇以mac版本作为说明,其他平台基本一致

Charles相关链接

http/https抓包配置


  1. charles配置
    • 关闭macOS Proxy (Proxy - macOS Prox)
    • 设置charles监听端口(Proxy或小齿轮 - proxy settings)如我设置为8888
    • 为了抓https包,设置SSL proxying (proxy - ssl proxying setting) , 添加host *,port *
  2. 获取、安装证书及信任证书
    • 电脑浏览器配置

      • help - ssl proxying - install charles root certificate(如果使用一段时间后证书过期,再次重复该步骤
      • 钥匙串 - 证书 - 选择 charles证书 - 始终信任
      • 设置浏览器代理监听端口,如chrome使用SwitchyOmega来管理代理,设置与charles相同的监听端口即可,如127.0.0.1:8888
    • 模拟器及真机配置

      • 局域网内wifi设置代理,如我电脑的ip为192.168.2.10,端口设置同charles配置的8888
      • android:系统浏览器访问chls.pro/ssl下载证书(发现小米系统浏览器下载的是crt文件,不能正确安装证书,请换其他浏览器尝试下载的是pem文件),然后安装证书(各手机厂商安装方式略有不同,请自行百度)
      • iOS:safari访问chls.pro/ssl安装,并到设置-通用-描述文件中安装证书,然后在设置-关于本机-证书信任设置中打开刚安装证书的信任开关
    • 浏览器配置

      • 如chrome浏览器,安装Proxy SwitchyOmega插件,配置代理如127.0.0.1:888或192.168.2.10:8888,在插件中切换代理走charles即可抓到浏览器的包了

通过以上的设置,不出意外就可以正常抓http和https的包了

关于安卓抓包限制的几点说明


  1. 安卓6.0及以下app信任用户级证书,因此可以正常抓https包,非自家app可采用安卓6.0及以下手机或模拟器抓包
  2. 安卓7.0及以上app只信任系统证书,因此想在7.0及以上抓包,需要将证书装到系统级别中。以下提供几种方式,成本自己计算
  3. charles官方关于ssl certificates的说明

mac上charles 4.5.6版本中文乱码问题


如果按照抓包配置还出现乱码的话,可参看官方关于乱码的问题说明

也就是说如果服务器返回的数据没有指定encoding的话,Charles就会去猜测这个编码,而一般情况下都是错的,因此为了解决这个问题,我们就来手动指定encoding

如下为某app的返回出现乱码问题截图:

  • 查看返回数据的Headers中的Content-Type为application/octet-stream
  • 使用rewirte功能来改写modify header即可
  • tools - rewrite - 添加rewrite rule,如下图所示

charles常用场景


查找包含某一关键词的相关session

快捷键:command+f

过滤

  • filter中输入需要过滤的域名关键词即可如baidu则过滤仅显示包含baidu关键词域名的session
  • filter输入框后settings勾选fliter uses regex即可支持正则过滤,则在输入框中可输入正则表达式来过滤需要的session

交互式拦截请求与响应

交互式即设置断点breakpoints

  • 方法1: proxy - breakpoints settings 添加相应的断点(可针对请求或响应)
  • 方法2: 一般不通过方法1添加,手动填写可能比较麻烦。在需要设置断点的session上右键-breakpoints即可(默认同时断点请求和响应,可通过方法1中setting做进一步修改)
  • 实战示例:修改如下session中的json响应数据"Result": false"Result": true
  1. 右键抓到的该请求
  2. 选择breakpoints
  3. 菜单栏proxy - breakpoints setting对该请求进一步修改:只勾选断点response
  4. 再次发起请求 - 断点响应后 - 选择 edit response - 修改数据 - execute

一般情况下,这种来不及通过这种方式修改,app一般在响应超时时,会发起重试或者返回响应超时。但有些请求app请求超时时间设置较长的话(5s-10s)还是可以通过这种方式修改的

mock对请求与响应进行动态修改

  1. rewrite

    rewrite功能在上面解决charles中文乱码问题时也用到了,步骤基本一致
    目前版本并没有右键某一session选择rewrite功能,需要在tools -rewrite中添加

    可修改的类型如下:

  2. map local

    • 右键选择需要修改的session
    • 选择map local
    • 选择本地文件:文件内容需要修改成的响应体如json串等
  3. map remote

    • 右键选择需要修改的session
    • 选择map remote
    • map to本地api或测试服务器等

模拟弱网

  • proxy - start throttling 或点击小乌龟按钮
  • 可在throttle setting中做进一步设置需要的弱网网络状况