为什么charles/fiddler可以明文抓取https

理解https的抓包原理,首先要理解中间人的概念,也就是MITM。

MITM介绍

MITM(Man-In-The-Middle,中间人),能够与网络通信的两端分别创建连接,交换其收到的数据,使得通讯两端都认为自己直接与对方对话,实际上整个会话被中间人控制。

简而言之,就是在真正的服务端看来,中间人是客户端;而对真正的客户端来说,中间人是服务端。

主要原理介绍

常见的http/https抓包工具charles/fiddler的工作原理与中间人一致,都是通过创建本地的proxy服务,然后修改浏览器的proxy配置来达到拦截流量的目的。

对于https连接来说,中间人要满足以下两点,才能实现真正的明文代理:

中间人,作为客户端与真实服务端建立连接这一步不会有问题,因为服务端不会校验客户端的身份;
中间人,作为服务端与真实客户端建立连接,这里会有客户端信任服务端的问题,也就是服务端必须有对应域名的私钥;

中间人要拿到私钥只能通过如下方式:

  • 1.去网站服务端拿到私钥;
  • 2.去CA处拿域名签发私钥;
  • 3.自己签发证书,切要被浏览器信任;

不用解释,抓包工具只能使用第三种方式取得中间人的身份。

使用抓包工具进行https抓包的时候,需要在客户端安装charles/fiddler的根证书,这里实际上起认证中心(CA)的作用。

charles能够抓包的关键是客户端会往系统受信任的根证书列表中导入charles生成的证书,而这个证书会被浏览器信任,也就是charles给自己创建了一个认证中心CA,客户端拿着中间人签发的证书去中间人自己的CA去认证,当然认为这个证书是有效的。因此代理作为中间人取得了客户端的信任。

charle/fiddler抓包https时,作为中间人,与客户端连接时,中间人自己生成证书,并且使用自己的CA进行签名,取得客户端的信任;与服务端连接时,中间人接受服务端的证书,与服务端不存在信任问题。因此就实现了https的代理。

具体流程

客户端向服务器发起HTTPS请求

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

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

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

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

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

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

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

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

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

你可能感兴趣的:(为什么charles/fiddler可以明文抓取https)