1、首先设置proxy>proxy setting> 勾上enable transparent HTTP proxying。
2、安装电脑端证书help>ssl proxying>install Charles Root Certificate
3、在证书页面选始终信任
4、手机端下载证书help>ssl proxying>XXXX Modile Device XXX
5、手机和电脑连接同一个网络,在网络的高级设置中填写上图的IP(10.0.69.179:8888)
6、Proxy -> SSL Proxying Settings...,选择SSL Proxying > add > host:*,port:443
Android
7、在手机浏览器访问chls.pro/ssl 自动下载证书。(推荐使用Chrome浏览器),从 下载内容 里面点击证书完成安装。
Android
8、在项目res 下添加xml 文件夹以及network_security_config.xml 文件
内容:
<base-config cleartextTrafficPermitted="true">
<certificates src="system" overridePins="true" />
<certificates src="user" overridePins="true" />
</network-security-config>
9、在manifest 的application节点下添加引用
android:networkSecurityConfig="@xml/network_security_config"
10、打开APP进行网络请求,最后一步在Charles在打开的网址上右键设置 enable SSL proxying ,再次访问刚才的请求就好了。
Android 7.0(API 级别 24)及更高版本默认只承认系统CA,所以默认是安全的,不需要配置。
如果想要系统承认用户自己安装的CA,则修改配置(比如调试时会需要抓包)。
面向 Android 6.0(API 级别 23)及更低版本应用的默认配置如下所示,这段配置的意思是,承认系统CA和用户自己安装的CA,
但这是一个默认配置,目前在6.0及以前好像都不起作用,即使去掉了user,依然承认自己安装的CA,不能确保100%防止https抓包
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
<certificates src="user" />
</trust-anchors>
</base-config>
</network-security-config>
面向 Android 7.0(API 级别 24)及更高版本应用的默认配置如下所示,即只承认系统CA,如果要承认自己安装的CA,像上述6.0配置那样加上user即可
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
</network-security-config>
实际操作:
1、在res/xml/下创建network_security_config.xml文件
2、文件写入上述配置
3、在清单文件的application标签下,引入此配置
<application android:networkSecurityConfig="@xml/network_security_config"
... >
...
</application>
官方地址:https://developer.android.com/training/articles/security-config#ConfigCustom
IOS
11、IOS系统描述文件
在iOS 10.3之前,当你将安装一个自定义证书,iOS会默认信任,不需要进一步的设置。
而iOS 10.3之后,安装新的自定义证书默认是不受信任的。
12、信任证书
如果要信任已安装的自定义证书,需要手动打开开关以信任证书。
iOS11下需要手动信任已下载好的证书,方法如下:
设置->通用->关于本机->证书信任设置-> 找到charles proxy custom root certificate然后信任该证书即可.
原理简析
如果是HTTP请求,因为数据本身并没加密所以请求内容和返回结果是直接展现出来的。
但HTTPS是对数据进行了加密处理的,如果不做任何应对是无法获取其中内容。所以Charles做的就是对客户端把自己伪装成服务器,对服务器把自己伪装成客户端:
1、Charles拦截客户端的请求,伪装成客户端向服务器进行请求
2、服务器向“客户端”(实际上是Charles)返回服务器的CA证书
3、Charles拦截服务器的响应,获取服务器证书公钥,然后自己制作一张证书,将服务器证书替换后发送给客户端。(这一步,Charles拿到了服务器证书的公钥)
4、客户端接收到“服务器”(实际上是Charles)的证书后,生成一个对称密钥,用Charles的公钥加密,发送给“服务器”(Charles)
5、Charles拦截客户端的响应,用自己的私钥解密对称密钥,然后用服务器证书公钥加密,发送给服务器。(这一步,Charles拿到了对称密钥)
6、服务器用自己的私钥解密对称密钥,向“客户端”(Charles)发送响应
7、Charles拦截服务器的响应,替换成自己的证书后发送给客户端
当然,如果用户不选择信任安装Charles的CA证书,Charles也无法获取请求内容。
还有一种,如果客户端内置了本身的CA证书,
这时如果Charles把自己的证书发送给客户端,客户端会发现与程序内的证书不一致,不予通过,此时Charles也是无法获取信息的。
https://www.jianshu.com/p/ec0a38d9a8cf?utm_campaign=hugo