charles配置
charles常用场景
关于Charles
在之前的文章介绍过fiddler的使用,但由于fiddler跨平台支持不是很好(也有跨平台的fiddler everywhere,但并功能并不强大)。
因此这里来介绍一款功能强大,且支持多平台的一款代理工具神器——charles(青花瓷)
本篇以mac版本作为说明,其他平台基本一致
Charles相关链接
http/https抓包配置
- charles配置
- 关闭macOS Proxy (Proxy - macOS Prox)
- 设置charles监听端口(Proxy或小齿轮 - proxy settings)如我设置为8888
- 为了抓https包,设置SSL proxying (proxy - ssl proxying setting) , 添加host
*
,port*
- 获取、安装证书及信任证书
-
电脑浏览器配置
- 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的包了
关于安卓抓包限制的几点说明
- 安卓6.0及以下app信任用户级证书,因此可以正常抓https包,非自家app可采用安卓6.0及以下手机或模拟器抓包
- 安卓7.0及以上app只信任系统证书,因此想在7.0及以上抓包,需要将证书装到系统级别中。以下提供几种方式,成本自己计算
- 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
- 右键抓到的该请求
- 选择breakpoints
- 菜单栏proxy - breakpoints setting对该请求进一步修改:只勾选断点response
- 再次发起请求 - 断点响应后 - 选择 edit response - 修改数据 - execute
一般情况下,这种来不及通过这种方式修改,app一般在响应超时时,会发起重试或者返回响应超时。但有些请求app请求超时时间设置较长的话(5s-10s)还是可以通过这种方式修改的
mock对请求与响应进行动态修改
-
rewrite
rewrite功能在上面解决charles中文乱码问题时也用到了,步骤基本一致
目前版本并没有右键某一session选择rewrite功能,需要在tools -rewrite中添加可修改的类型如下:
-
map local
- 右键选择需要修改的session
- 选择map local
- 选择本地文件:文件内容需要修改成的响应体如json串等
-
map remote
- 右键选择需要修改的session
- 选择map remote
- map to本地api或测试服务器等
模拟弱网
- proxy - start throttling 或点击小乌龟按钮
- 可在throttle setting中做进一步设置需要的弱网网络状况