上一篇博文我实现了使用charles抓包手机端app,但是并没有解释为什么charles能够抓包手机端app,因为手机端请求的数据都是采用https协议传输的,https协议是安全的传输协议,那么charles为什么能够截获https的报文呢?本篇文章我就来一探究竟。
首先我们先了解一下charles在整个过程中都做了哪些事?其实charles主要做了两件事:1 截获真实客户端的https请求,伪装客户端向真实服务器发送请求。2 接收真实服务器的响应,用charles自己的证书伪装服务端发送的数据内容。
如何让客户端信任charles:还记得之前有一步操作很重要,就是在手机端安装charles proxy ca证书,并且让手机端信任该证书!这一步操作保证了charles可以冒充成代理服务器,顺利截取手机端的https的报文。
从下面这张图我们可以更加清晰的理解整个过程。
整个过程可以总结如下:
1 客户端向服务器发起HTTPS请求。
2 Charles拦截客户端的请求。
3 服务器向“客户端”(实际上是Charles)返回服务器的CA证书。
4 Charles拦截服务器的响应,获取服务器证书公钥,然后自己制作一张证书,将服务器证书替换后发送给客户端。(这一步,Charles拿到了服务器证书的公钥)。
5 客户端接收到“服务器”(实际上是Charles)的证书后,生成一个对称密钥,用Charles的公钥加密,发送给“服务器”(Charles)。
6 Charles拦截客户端的响应,用自己的私钥解密对称密钥,然后用服务器证书公钥加密,发送给服务器。(这一步,Charles拿到了对称密钥)。
7 服务器用自己的私钥解密对称密钥,向“客户端”(Charles)发送响应。
8 Charles拦截服务器的响应,替换成自己的证书后发送给客户端。
至此,连接建立,Charles拿到了 服务器证书的公钥 和 客户端与服务器协商的对称密钥,之后就可以解密或者修改加密的报文了。
从整个过程来看,我们不难发现,正是由于手机客户端安装并信任了charles proxy ca证书,才使得charles能够顺利截获报文。
HTTPS抓包的原理还是挺简单的,简单来说,就是Charles作为“中间人代理”,拿到了 服务器证书公钥 和 HTTPS连接的对称密钥,前提是客户端选择信任并安装Charles的CA证书,否则客户端就会“报警”并中止连接。这样看来,HTTPS还是很安全的。