浅谈Charles抓取HTTPS原理

作者: rushjs | 来源:发表于2017-02-19 21:53 被阅读1636次

关于HTTPS,你需要知道的全部中,分析了HTTPS的安全通信过程,知道了HTTPS可以有效防止中间人攻击。但用过抓包工具的人都知道,比如Charles,Fiddler是可以抓取HTTPS请求并解密的,它们是如何做到的呢?

首先来看Charles官网对HTTPS代理的描述:

Charles can be used as a man-in-the-middle HTTPS proxy, enabling you to view in plain text the communication between web browser and SSL web server.`

Charles does this by becoming a man-in-the-middle. Instead of your browser seeing the server’s certificate, Charles dynamically generates a certificate for the server and signs it with its own root certificate (the Charles CA Certificate). Charles receives the server’s certificate, while your browser receives Charles’s certificate. Therefore you will see a security warning, indicating that the root authority is not trusted. If you add the Charles CA Certificate to your trusted certificates you will no longer see any warnings – see below for how to do this.

Charles作为一个“中间人代理”,当浏览器和服务器通信时,Charles接收服务器的证书,但动态生成一张证书发送给浏览器,也就是说Charles作为中间代理在浏览器和服务器之间通信,所以通信的数据可以被Charles拦截并解密。由于Charles更改了证书,浏览器校验不通过会给出安全警告,必须安装Charles的证书后才能进行正常访问。

下面来看具体的流程:

Charles抓取HTTPS流程
  1. 客户端向服务器发起HTTPS请求

  2. Charles拦截客户端的请求,伪装成客户端向服务器进行请求

  3. 服务器向“客户端”(实际上是Charles)返回服务器的CA证书

  4. Charles拦截服务器的响应,获取服务器证书公钥,然后自己制作一张证书,将服务器证书替换后发送给客户端。(这一步,Charles拿到了服务器证书的公钥)

  5. 客户端接收到“服务器”(实际上是Charles)的证书后,生成一个对称密钥,用Charles的公钥加密,发送给“服务器”(Charles)

  6. Charles拦截客户端的响应,用自己的私钥解密对称密钥,然后用服务器证书公钥加密,发送给服务器。(这一步,Charles拿到了对称密钥)

  7. 服务器用自己的私钥解密对称密钥,向“客户端”(Charles)发送响应

  8. Charles拦截服务器的响应,替换成自己的证书后发送给客户端

  9. 至此,连接建立,Charles拿到了 服务器证书的公钥 和 客户端与服务器协商的对称密钥,之后就可以解密或者修改加密的报文了。

HTTPS抓包的原理还是挺简单的,简单来说,就是Charles作为“中间人代理”,拿到了 服务器证书公钥HTTPS连接的对称密钥,前提是客户端选择信任并安装Charles的CA证书,否则客户端就会“报警”并中止连接。这样看来,HTTPS还是很安全的。

相关文章

网友评论

  • 4021606a5cc9:8. “Charles拦截服务器的响应,替换成自己的证书后发送给客户端。”
    能否具体说明一下“替换成自己的证书”是什么意思?Charles接收服务器的内容后需要解密再发送给客户端吗?
    硅谷小虾米:@wwwmzyingcom 1.对称加密主要用于报文的加密,Charles作为中间人在第一步替换服务器要给客户端证书的时候就已经把自己的证书给了客户端,客户端在校验这个证书的时候(你在电脑上已经下载并且相信了Charles的根证书了,客户端肯定会校验成功)相信了这个证书是真实有效的,所以才放心的把对称加密的私钥给了Charles。Charles再给服务器(用的是服务器的证书),所以三个人持有的对称秘钥是相同的。

    2.当然可以不用解密,但是如果不解密报文那这种主动网络攻击的意义是什么?

    3. 会用到证书,因为有两个原因:1 http(https)是短连接,每次客户端请求服务器返回数据之后这次会话就结束了,下次一次再请求数据的只能重新建立连接(区别于Scoket的长连接)。2 每一次请求数据的时候报文部分对称加密的秘钥都不相同。这个秘钥是个随机数(随机数的获取采用的是一种计算机中叫做熵的一个东西),所以每一次解密报文都需要用到证书来获取这个秘钥(加密报文的对称加密秘钥)才行。
    4021606a5cc9:@硅谷小虾米 非常感谢您的回复! 再问几个问题,非常非常期待您能回复。

    1. 客户端,Charles,服务端三个端的对称加密秘钥是否都是一样的?
    因为服务端在进行SSL握手的时候,客服端把可以支持的加密方式和对称加密秘钥发给了Charles,Charles又转发给了服务端。

    2. 如果三个端的对称加密秘钥都一样,Charles仅仅是把数据转发给客服端,是否可以不需要解密?

    3. 在SSL握手成功以后,还会使用到证书吗?使用到哪些部分?
    硅谷小虾米:1.因为在第一步客户端获取证书的时候获取的并不是服务器的证书,而是Charles(中间人)自己做的CA证书,这个时候客户端信任的是charles的证书(自始至终客户端都没有拿到真实的服务器证书)。所以在以后和客户端通讯中,Charles都需要把证书替换成自己的证书才可以。
    2. 需要解密,之后解密之后Charles才能用自己的证书再加密发送给客户端
  • Best_Kai:既然charles 可以对数据进行解密,是否只要自己信任了其他的中间代理人的证书,数据同样可以被修改,解密?是不是可以这样理解,https也是相对安全?
    rushjs: @Best_Kai 是的,安全只是相对的。

本文标题:浅谈Charles抓取HTTPS原理

本文链接:https://www.haomeiwen.com/subject/fczjwttx.html