项目最近由 http 转成了 https, 但是charles 不能抓 https 的包,而搜各种资料去发现都因为 charles 版本过低无法用,所以记录下我的解决办法.
Charles为什么能抓 https?
都知道 http是明文传输,而 https 的出现就是为了解决这个问题,https 协议是由 SSL+http 协议构建的加密传输网络协议.但既然是加密的,那为什么能抓到?
先看看 Charles 官网是怎么解释的:
charles_ssl.png很明显, "man-in-middle",就是使用中间人攻击.
因为 https 使用的是非对称加密,那就要了解https的传输交互过程:
https 传输过程.jpg
1.首先是客户端发起 https 请求,链接到server的443接口
2.服务端收到请求后把公钥传给客户端
3.客户端解析证书,如果没有问题,用加密算法生成一个对称密钥,然后用公钥加密
4.把加密后的值传给服务端
5.服务端用私钥解密后,之后的通信都是对已对称密钥进行加密和解密的通信
看起来很安全了吧,但中间人攻击又是怎么做到的呢?
第一步,当客户端发起 SSL握手时,中间人劫持用户请求然后中间中伪装客户端发起 SSL握手.
第二步,服务端会发送公钥给中间人,当然中间人是有一对自己的公钥和私钥,中间人会把中间人自己的公钥发送给客户端.
第三步,客户端拿到公钥会根据加密算法加密,发送对称密钥,这时候中间人利用自己的私钥可以解出对称密钥,这时候中间人已经拿到公钥和对称密钥,再用服务端发给中间人的公钥来加密对称密钥,发送给服务器.
第四步,之后客户端和服务端所有的请求的数据都会被中间人利用对称密钥解密得到所有的信息.
当然 charles 使用的中间人攻击必须要我们要信任它的证书,不然还是不能得到数据,https是可以防止中间人攻击的,因为服务器的公钥是用证书的,
charles伪造的证书一般浏览器会警告,所以我们需要将charles的证书认为可靠的。从而实现中间人。
以上之后我了解的一点点的相关知识.
进入教程
Charles版本: V4.0.2
第一步:点击install Charles Root Certificate, 之后会跳到钥匙串
step1.png
第二步:找到 Charles 的证书然后选择使用此证书时: 始终信任.
step2
第三步:在手机上安装 Charles 的根证书
step3
第四步:在手机上安装完之后,回到 Charles-Proxy-SSLProxying Setting,
把需要劫持的 host加上,端口号443,注意这里的 host 可以使用通配符也可以直接填 host.
step4.png
到这里就差不多教程就结束了,这次在 charles 上抓 https 只是工作中的一个小插曲,但是去了解为什么能抓到让我产生兴趣,在去深入了解的过程中也加深和修正了一些知识点,记录为文.
网友评论