Charles使用二三事

概览

  • https代理
  • 本地和远程映射
  • 断点调试

环境

macOS Sierra 10.12.3
Charles 4.0

https代理

关于如何用Charles实现代理https请求,网上有很多,简单说说

  1. macOS上下载并在钥匙串中选择信任Charles证书
  2. iOS设备以macOS为代理,访问http://www.charlesproxy.com/getssl
  3. Charles上配置https代理的相关内容(Proxy > SSL Proxying Settings)

详细的可以参考SSL Certificates

下面来说说原理

什么是http代理

HTTP 代理存在两种形式
第一种是 RFC 7230 - HTTP/1.1: Message Syntax and Routing(即修订后的 RFC 2616,HTTP/1.1 协议的第一部分)描述的普通代理。这种代理扮演的是「中间人」角色,对于连接到它的客户端来说,它是服务端;对于要连接的服务端来说,它是客户端。它就负责在两端之间来回传送 HTTP 报文。

如果用Charles抓包查看请求头一般应该都是这个,所以这儿只关注这种方式的,另一种的详情可参考文章末尾的链接网站

下面这张图片来自于《HTTP 权威指南》,直观地展示了上述行为:

简单说得出的结论就是: 如果用Charles做代理,那么安装了Charles的设备(比如我的mac)就充当了服务器。

https的s

先贴两张尝试说明什么是https的图

来自Wiki-传输层安全协议

来自下面的参考链接

可以知道结束ssl验证后,还是发送http明文,只要能让ssl验证通过即可,而要通过验证主要就看客户端信不信任服务器的证书。查看上面第一与第二步中得到的证书,序列号是一样的,主要目的就是为了让客户端(iOS)能信任服务器(macOS)的证书,从而通过ssl验证,得到http的内容。

本地和远程映射

本地映射和远程映射可用于测试,简单说就是替换请求的响应结果,这里纯粹为了测试,简单创建一个场景

如果你使用某些应用出现了下面这种情况

应用有一种类似要求强制更新的策略,可以简单使用Charles本地映射Pass

经过一些简单的尝试,大致知道了应用弹窗的实现规则

在某个请求的响应结果的,一个字段标识是否有新版本,有则发送新版本的iTunes下载地址(给button点击使用),弹窗的内容。所以只要通过本地映射,修改返回的内容,让客户端认为没有新版本即可。

修改返回的弹窗信息

如果每次请求,服务器都会验证版本的话,那么改这个也没有什么意义,只是为了形象的说明本地映射是什么,远程映射功能也是一样的。本地映射和远程映射在CharlesTools菜单项下可以找到

断点调试

在少数π的这篇文章中利用Charles Proxy下载旧版本iOS App,其中就利用到了断点调试。获取了微信的产品号后通过设置断点,再次请求,中断,修改请求的参数,从而实现下载旧版本的应用。

总结:Charles还有其他很多的用处,比如模仿低速的网络状态,设置DNS解析等

170413 更新

要使用 Charles 需要设置代理,可以用 macOS 上的 “通用剪贴板”,这样可以避免在 iPhone 输入 ip 的麻烦。

参考

IntelliJ IDEA Main函数传参 iOS摇一摇
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×