Mac使用Charles抓取macOS/iOS/Android的请求

抓取macOS(本机)的请求

先在mac上安装根证书:helpSSL ProxyingInstall Charles Root Certificate
Xnip2018-11-11_13-47-53.png
上一步点击Install Charles Root Certificate后它会自动打开钥匙串,点击钥匙串的Trust(信任)→Always Trust(始终信任),然后直接关闭窗口(没有保存按钮,也不用点保存,直接关闭窗口即可)。
Xnip2018-11-11_14-09-37.png
上一步关闭窗口会提示输入密码,输入后点击Update Settings(更新设置),然后就可以把钥匙串退出了。
Xnip2018-11-11_14-08-51.png
打开网络设置
Xnip2018-11-11_14-23-38.png
点击高级
Xnip2018-11-11_14-29-09.png
点击Proxies,把Web Proxy(Http)Secure Web Proxy(Https)勾上,如果Automatic Proxy Configuration有勾,则把它去掉,一般Automatic Proxy Configuration默认勾上的原因是你用了代理软件(比如ss),最好先把ss关掉,注意你关闭ss的时候,网络设置里它会把你已经勾上的http和https都取消勾选,所以这个要注意反复检查是否勾上了。
Xnip2018-11-11_14-32-31.png
另外勾上的这两个,都要填写代理服务器地址127.0.0.1:8888
Xnip2018-11-11_14-37-54.png
Xnip2018-11-11_14-38-07.png
注意,上一步的端口8888就是对应Charles的ProxyProxy Settings里的Http Proxy的端口,这个8888可以改成其他数字(最大65535),但不能是本地已使用的(例如80最好别用,因为你本地有可能有nginx或者apache占用了这个端口),因为此时Charles就是一个HTTP代理服务器,它监听你设置的这个端口,所以如果这个端口已经被占用,那显然就会出问题。
整个的原理,就是在网络设置里,把mac本机的http和https请求全部转发到代理服务器(这个代理服务器就是Charles),因为Charles是在本机,所以代理服务器ip地址自然就是本机环回测试ip127.0.0.1,而端口在Charles里有设置,只要两边对上,端口未被其他程序占用就行。
Xnip2018-11-11_15-15-04.png
ProxySSL Proxy Settings里,要把*:443加上(如果没有的话),*表示任何ip,:443表示443端口,因为443端口是https的端口,所以要允许,否则无法抓取https的包
Xnip2018-11-11_15-47-51.png
Xnip2018-11-11_14-35-28.png
上面全部配置好,随便刷新一个网页,在Charles里看,应该就能看到请求了(看不到请一步一步对一下,看漏了哪里,实在不行关掉Charles再开看看)
Xnip2018-11-11_15-59-32.png

抓取iPhone手机的请求

也要先安装根证书
Xnip2018-11-11_17-57-03.png
这里说的很清楚,配置你的设备以使用Charles作为它在http://192.168.0.102:8888的代理,然后用iPhone的Safari浏览器访问这个地址chls.pro/ssl来安装证书。
Xnip2018-11-11_17-56-29.png
根据上面所说的,我们在iPhone的设置无线局域网
Xnip2018-11-11_18-18-33.png
点右边那个¡
Xnip2018-11-11_18-20-49.png
点击配置代理
Xnip2018-11-11_18-26-48.png
选择手动,然后填写Charles提示的IP和端口,注意,ip和端口不要照填我的,上面Charles弹出的那个提示框里有你自己的ip和端口。
Xnip2018-11-11_18-29-10.png
点击存储保存,保存后mac上的Charles会提示有一个链接试图连接Charles,这个就是手机的链接,这时当然要允许,即点左边的Allow(允许)按钮。
Xnip2018-11-11_18-35-14.png
允许之后,iPhone打开Safari浏览器,输入前面Charles提示的地址:chls.pro/ssl,然后根据提示一步一步安装证书。
点击允许
Xnip2018-11-11_18-46-03.png
点击右上角的安装
Xnip2018-11-11_18-46-15.png
输入密码
Xnip2018-11-11_18-46-39.png
点击安装
Xnip2018-11-11_18-46-29.png
点击右上角的完成
Xnip2018-11-11_18-46-57.png
手机随便打开一个app或网页,随便点一下,即可看到Charles抓到的请求。
Xnip2018-11-11_18-38-52.png
Xnip2018-11-11_18-38-34.png
不使用的时候手机要关闭代理,否则会上不了网(离开你办公室后),或者很慢(因为通过电脑代理肯定比较慢)。
说一下,其实不安装证书直接设置代理也是可以的,只是这样就只能抓http的包,https的就抓不了,而现在很多服务都用https了,所以还是要安装证书!

抓取Android手机的请求

安卓与iPhone安全一样,也是设置代理,安装证书,但可能容易出问题,比如我的魅蓝S6自带浏览器安装了证书也不行,而Chrome就可以,但小米3 Chrome浏览器也不行,不知道什么问题。

使用自动代理

对于抓包调试手机网页或app,很多童鞋可能遇到过手机如果用wifi怎么也上不了网,而用流量就可以,一度还怀疑wifi网络有问题,最后才发现是因为测试接口抓包的时候忘把代理关掉,把它关掉就可以上了,但是下次测试又得重新设置代理,特别麻烦。
事实上我们使用自动代理,就可以实现『即使忘了关代理也不会上不了网』的问题。自动代理是让配置文件决定要不要代理,配置文件我们叫pac文件(proxy auto config),后缀也是.pac结尾。
以下配置文件的意思,就是判断请求的域名是否为www.hexotest.com,如果是,则把它代理到192.168.0.102:8888,如果192.168.0.102:8888无法访问,那么走后面的DIRECT即直连,不代理了。如果域名不是www.hexotest.com那就直连不走代理。
//一个很简单的调pac文件
function FindProxyForURL(url, host) {
    //这里填写你们公司的host
    if (dnsDomainIs(host, 'www.hexotest.com')) {
        //这里填你自己的局域网ip,端口号是你在Charles里设置的 默认8888
        return "PROXY 192.168.0.102:8888; DIRECT;";
    } else {
        return "DIRECT";
    }
}
Bash
把配置文件命名成xxx.pac,比如我命名成proxy.pac,然后放到nginx目录里,让它可以访问,比如电脑的ip是192.168.0.102,那么我通过在手机通过http://192.168.0.102/proxy.pac就可以访问,这样,手机就会根据pac文件的配置来决定是否代理。
Xnip2018-11-11_18-27-11.png
电脑的话也一样,不过因为配置文件就在电脑本地,所以ip就是127.0.0.1,但是要注意,如果你用了科学上网工具ss,一定要把这工具先关掉,否则它会占用这个配置。
Xnip2018-11-11_21-35-22.png
pac配置文件除了可以放本地,也可以放外网线上,这样你手机可以一直设置着,不会因为你电脑的ip可能会变,又要改ip。