概览
- https代理
- 本地和远程映射
- 断点调试
环境
macOS Sierra 10.12.3
Charles 4.0
https代理
关于如何用Charles实现代理https请求,网上有很多,简单说说
- macOS上下载并在钥匙串中选择信任Charles证书
- iOS设备以macOS为代理,访问http://www.charlesproxy.com/getssl
- 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的图
来自下面的参考链接
可以知道结束ssl验证后,还是发送http明文,只要能让ssl验证通过即可,而要通过验证主要就看客户端信不信任服务器的证书。查看上面第一与第二步中得到的证书,序列号是一样的,主要目的就是为了让客户端(iOS)能信任服务器(macOS)的证书,从而通过ssl验证,得到http的内容。
本地和远程映射
本地映射和远程映射可用于测试,简单说就是替换请求的响应结果,这里纯粹为了测试,简单创建一个场景
如果你使用某些应用出现了下面这种情况
应用有一种类似要求强制更新的策略,可以简单使用Charles本地映射Pass
经过一些简单的尝试,大致知道了应用弹窗的实现规则
在某个请求的响应结果的,一个字段标识是否有新版本,有则发送新版本的iTunes下载地址(给button点击使用),弹窗的内容。所以只要通过本地映射,修改返回的内容,让客户端认为没有新版本即可。
修改返回的弹窗信息
如果每次请求,服务器都会验证版本的话,那么改这个也没有什么意义,只是为了形象的说明本地映射是什么,远程映射功能也是一样的。本地映射和远程映射在Charles的Tools菜单项下可以找到
断点调试
在少数π的这篇文章中利用Charles Proxy下载旧版本iOS App,其中就利用到了断点调试。获取了微信的产品号后通过设置断点,再次请求,中断,修改请求的参数,从而实现下载旧版本的应用。
总结:Charles还有其他很多的用处,比如模仿低速的网络状态,设置DNS解析等
170413 更新
要使用 Charles 需要设置代理,可以用 macOS 上的 “通用剪贴板”,这样可以避免在 iPhone 输入 ip 的麻烦。