charles是如何抓取https数据包的

先给结论:中间人攻击(man in the middle attack),下面在展开说。

1. HTTPS

HTTPS是一种安全的构建在http基础上的安全传输协议。HTTPS由两部分组成:HTTPS和TLS。HTTP大家都很熟悉,全称是Hyper Text Transfer Protocal,超文本传输协议。HTTP的问题是数据是明文传输的,明文传输的问题在于HTTP整个传输过程中任意一个环节出问题都会导致信息的泄露以及篡改,比如一到年底就很常见的运营商流量劫持,这里就不展开细说了。

TLS是Transport Layer Security的简称,中文一般叫做安全传输层协议。有些人或许觉得TLS有点陌生,但是它的前身,你们一定都知道,SSL。我们知道建立TCP连接需要三次握手,而TLS握手需要九次,而这个过程主要就是用来做非对称加密。这也是为什么HTTPS出来很长一段时间内,大部分网站还是采用HTTP协议的原因之一,当然其他原因还有加密解密比较吃CPU,这里先按住不表。

2. Charles

Charles是一款很好用的抓包软件,对于网站开发、信息安全以及App开发人员基本是必备的。

关于Charles使用,可以参考乌云的这篇charles使用教程指南

我们知道Charles不仅可以抓取HTTP数据包(这是自然),那么她是如何抓取HTTPS的数据包呢?我们下面一点一点说。

3. 非对称加密

HTTPS使用的是非对称加密。要理解非对称加密,需要先理解对称加密。简单来说,对称加密就是加密解密使用同一个密钥。浏览器和服务器交互的话一般会动态生成一个密钥,所以密钥如何安全传递就成了问题。非对称加密正是为了这个目的,也就是密钥交换(也叫密钥协商)。

浏览器和服务器每次新建会话时都使用非对称密钥交换算法协商出对称密钥,使用这些对称密钥完成应用数据的加解密和验证,整个会话过程中的密钥只在内存中生成和保存,而且每个会话的对称密钥都不相同(除非会话复用),中间者无法窃取。

服务器有一对公钥和私钥,公钥用于加密,私钥用于解密。密钥交换过程:服务器的公钥是公开的,私钥是不公开的。浏览器先向服务器取得公钥,然后用公钥加密自己的私钥连同自己私钥加密的请求一并发送给服务器。服务器使用自己私钥解密得到浏览器的私钥,使用浏览器的私钥解密请求。然后再用浏览器的私钥加密response发送回服务器。

但是这里公钥是可以被人伪造的。那么就出现了证书(Certification Authority, CA)。CA由专门的CA厂商发布,当然厂商也分很多种,我们的浏览器也可以选择不信任,比如我们访问12306的时候,会出现下面这张图。可以看到这个CA是SRCA发布的,而Safari就不是很相信。

4. 中间人攻击

中间人攻击是一种很形象的说法,那么一定有人会问了(好吧,也可能没人问),『中间是谁的中间啊?』,是客户端和服务器的中间,这也是我为什么说她形象的原因了。简单来说,中间人攻击就是通过破解客户端和服务器的正常通信数据并进行数据篡改而达到攻击的目的。具个简单例子,DNS欺骗就是一种中间人攻击。

5. Charles抓取HTTPS数据包

正常的中间人攻击是无法攻击HTTPS的,首先所有的传输数据都是加密的,其次中间人无法伪造服务器,因为证书的问题。而Charles的中间人角色需要我们手动添加Charles的证书信任。这样浏览器眼中的服务器就是Charles,而服务器眼中的客户端也是Charles,从而实现了双向数据解密。

6. ATS

ATS是App Transport Security的简称,iOS采用的HTTPS协议传输。下面是如何在这种情况下使用Charles。

You need to disable App Transport Security in your app to use Charles SSL Proxying with apps running on iOS 9.
To disable ATS you need to add keys to your app’s Info.plist file, as below. See this tech note from Apple for more information.
You must remember to re-enable ATS before you release your app to take advantage of the security that ATS provides.

1
2
3
4
5
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>

Note that this means that you cannot use Charles to observe SSL traffic from apps that you do not control.

ATS的一些信息:About ATS

iOS的ATS是一种对安全的加强。在About ATS里面我们可以看到ATS对证书的一些限制。现在无法使用Charles,则是因为iOS 9 认为这个连接不安全,目前的解决方案是禁用ATS。长远来看,要么Charles的证书能够是ATS眼中的『安全证书』,要么ATS自己修改spec将Charles的证书认为是安全的,但是这两种方法目前看来可能还需要一段时候。

7. Reference

维基百科HTTPS词条:HTTPS
SSL/TLS握手:SSL/TLS Handshake
维基百科中间人攻击词条:Man-in-the-middle attach
Charles Document: SSL Proxying