Charles拦截手机上的HTTPS请求

业务场景

  • 调试Hybrid App里Web页面的HTTPS请求。HTTPS请求因为经过加密,所以需要做一些额外的配置,否则只能看到乱码。
  • 我实践的设备是小米手机和Mac电脑,工具是Charles。
  • Mac上推荐Charles,Windows系统的电脑推荐Fiddler。

原理说明

  1. 让Charles能承担“中间人”这个角色,介入TLS/SSL握手
  2. 通过Charles官网获取一个根证书,用它生成签名认证的代理服务器证书
  3. 手机设置Charles为网络代理,此时手机里请求的服务器证书就是Charles自动生成的服务器证书,只要信任它,就能保证手机和Charles的TLS握手可以顺利完成。

设置Charles

  1. Proxy -> Proxy Setting… -> Proxies,这里除了动态端口dynamic port这个选项外,其他都启用,在下面Socks Proxy的设置里,在Ports里允许:80, 443, 8080
  2. Proxy -> SSL Proxying Settings -> SSL Proxying这里add一下,设为*443
  3. Charles根证书安装:Help -> SSL Proxying -> Install Charles Root Certificate。安装结束后,需要到Mac的钥匙链里去设置信任(需要输入你电脑的密码)

手机设置

  1. 给手机安装SSL证书:
    • 在Charle上:Help -> SSL Proxying -> Install Charles Root Certificate on a Mobile device or a remote Browser然后根据提示在手机上打开地址chls.pro/ssl去下载
    • 如果上一步不行,就Help -> SSL Proxying -> Save Charles Root Certificate…然后把文件保存下来,传到手机上,在手机上手动安装。
    • 注意如果使用的是iOS手机,需要在手机“设置”里主动去信任这个证书
  2. 手机的网络代理设置:
    1. 首先要和电脑在同一个局域网里
    2. 代理ip地址就设成运行着Charles的电脑的ip地址(在电脑上可以通过ifconfig en0查看inet后面的ip地址)
    3. 端口号是8888(默认)可以在Charles里改成别的,注意保持一致
    4. 通过数据线链接手机和电脑后,等待Charles弹出提示框,确认allow

手机安装证书的一些细节问题

  1. 可以在WIFI列表页下面找到“高级设置”,然后选择安装证书
  2. 证书的安装,点名小米,是稍微不一样的。需要:设置 -> 更多设置 -> 系统安全 -> 从存储设备里安装 -> 然后找到传到手机上的证书,安装,这里会让你验证手机解锁码(手势或者数字,看你怎么设置的手机)
  3. 小米手机在“验证手机解锁码”这里有一个坑:如果你的手机没有设置过密码,比如4位数字密码,这里会提示“输入证书存储的凭据”——一个让你感到非常困扰的提示,你根本想不到这是什么东西的密码,很多文章也不提。其实就是说你的手机需要有一个密码,到手机的“设置”里去给手机设置一个4位数字密码就行,这里需要的就是那个密码了。