前言
我们可以通过网络抓包,来分析网络请求和响应数据,甚至是可以修改请求或者响应来达到我们特殊的需求。在 Mac 环境下,一般使用 Charles 工具来进行网络抓包,当然 Charles 工具还提供了非常多其它实用的功能,在这里我们就只分析 Charles 是如何抓 HTTPS 的包的。
面对这个问题,我们首先需要了解 HTTP 通讯的流程,然后再引出 HTTPS 是什么,最后我们再看 Charles 工具是如何抓取 HTTPS 的包的。
HTTP 通讯过程及缺点
HTTP 超文本传输协议,是属于 TCP/IP 分层中的应用层,位于传输层之上(提供网络连接计算机之间的数据传输)。前面我们也知道,HTTP 为了快速的处理大量事务,确保协议的可伸缩性,所以设计的很简单:将 HTTP 的报文丢给传输层,利用传输层的 TCP 协议或者 UDP 协议来进行数据传输,然后再利用网络层的 IP 协议和数据链路层来进行最终的数据包传输。
这里我们主要看应用层和传输层:对于传输层,直接将应用层 HTTP 报文封装,然后直接传输,在这里不会做数据的加密,不会验证通信双方的身份,也不会校验报文的完整性。所以会导致一下问题:
- 由于通信报文是使用明文传输的,所以内容很容易被窃听。
- 由于不验证通信双方身份,这里很容易遭遇伪装(伪装服务器或者伪装客户端等),服务器也容易遭受 Dos 攻击。
- 不校验报文的完整性,会出现篡改报文信息的情况。
对于以上出现的问题,我们有必要对传输的报文做加密处理,校验报文的完整性,以及验证通信双方的身份。
HTTPS 通讯过程
对于上面 HTTP 出现的问题,我们需要定制一些机制和协议来完善:HTTP + 加密 + 认证 + 完整性保护 = HTTPS。然后就有了 SSL/TLS 协议,它处于应用层和传输层之间,在这里我们可以体会到分层的好处:可以很方便的扩展原有的功能。分层结构如下:
![](https://img.haomeiwen.com/i264052/7a23d660b120ac31.png)
这里我们先不描述传输层 TCP 协议是如何进行三次握手(建立连接)和四次挥手(断开连接),我们直接描述 HTTPS 的通信流程:
- 对于报文的加密:有对称加密和非对称加密方式,HTTPS 采用混合加密机制,在交换密钥环节,使用非对称加密,在之后通信交换报文阶段则使用对称加密方式。
- 对于验证通信双方身份:使用 CA 证书来校验身份。
- SSL 协议具有完整性校验
HTTPS 大概流程如下,详细的流程图可以参考下文末链接;
- 客户端将自己支持的加密算法发送给服务器,请求服务器证书;
- 服务器选取一组加密算法,并将证书返回给客户端;
- 客户端校验证书合法性,生成随机对称密钥,用公钥加密后发送给服务器;
- 服务器用私钥解密出对称密钥,返回一个响应,HTTPS连接建立完成;
- 随后双方通过这个对称密钥进行安全的数据通信。
Charles 抓包原理
Charles 通过将自己设置成系统的网络访问代理服务器,使得所有的网络访问请求都通过它来完成,从而实现了网络封包的截取和分析(这里类似中间人攻击)。配合 Charles 的 SSL 功能,Charles 还可以分析 HTTPS 协议。
对于如何使用 Charles 工具,可以参考这篇博客:Charles 从入门到精通
Charles 抓取 HTTPS 原理及流程
前面说过,HTTPS 可以有效防止中间人攻击,那 Charles 是如何抓取 HTTPS 包的呢
?
Charles 作为一个“中间人代理”,当浏览器和服务器通信时,Charles接收服务器的证书,但动态生成一张证书发送给浏览器,也就是说Charles作为中间代理在浏览器和服务器之间通信,所以通信的数据可以被Charles拦截并解密。由于Charles更改了证书,浏览器校验不通过会给出安全警告,必须安装Charles的证书后才能进行正常访问。
这里有个大前提,就是客户端信任了 Charles 自己制作的证书,然后导致 Charles 拿到 CA 证书和对称加密的公开密钥;这里我们简单总结下:
- 首先 Charles 假冒了客户端,拿到服务器的 CA 证书
- 然后 Charles 假冒了服务器,给客户端发送了一张自己制作的证书,客户端信任该证书
- Charles 再次假冒服务器,拿到客户端的对称密钥
- Charles 再次假冒客户端,将对称密钥加密发送给服务器,让服务器认为这次通信是没问题的,服务器发送成功响应
- 最后 Charles 假冒服务器将成功响应发给客户端
- 建立连接,客户端与 Charles 建立连接,Charles 与服务器建立连接(中间人攻击)
详细图文流程:浅谈Charles抓取HTTPS原理
总结
Charles 抓包,主要用的是中间人攻击。对于 HTTP 的话,可以直接抓取,但是对于 HTTPS,就需要在建立 HTTPS 连接的时候(SSL 连接),偷取证书和密钥。
文中很多知识点都是从参考文献学习到了,这里就不再重复摘抄了。
以上。
网友评论