Charles抓包原理

420 阅读6分钟

写这篇文章的原因是使用Charles抓包步骤较为繁琐,上手成本不低,容易遗漏某些步骤,导致抓包失败。抓包工具Fiddler同理,本文以Charles为例,可帮助理清整体逻辑流程,掌握核心要素,快速上手。

一、为什么可以拦截终端请求?

Charles作为一个中间人代理,在客户端给服务器端发消息的时候,会截取客户端发送给服务器的请求,然后伪装成客户端与服务器进行通信;服务器返回数据时将截取的数据发送给客户端,伪装成服务器与客户端进行通信。

image.png

1.1如何使用Charles抓包?

网上有很多教程,不赘述...个人认为比较完整且很不错的教程链接:www.codetd.com/article/153…

1.2关键步骤?

除去手机or电脑的setting教程步骤较多,关键步骤有以下几点:

1.2.1手机与pc位于同一局域网内

同一局域网下的设备连接到同一个网络中的路由器或交换机,这允许设备之间进行内网的通信和数据传输,使得设备可以相互访问和共享网络资源。处于不同网段的设备,需要通过路由器的路由功能进行转发才能互通。

1.2.2手机开启手动代理

手动设置代理即允许在手机上手动配置代理服务器为电脑的IP地址,以便通过电脑进行网络连接(tips:若电脑熄屏,手机无网络,请求发送失败) ,从而使电脑能够捕获和分析应用程序发送和接收的数据包。

1.2.3如抓取https请求,手机需下载证书

https证书下载缘由见下文...

二、拦截Https请求为什么需要添加证书?

2.1https如何保证安全?

HTTPS 采用的是对称加密非对称加密结合的「混合加密」方式:

  • 在通信建立前采用非对称加密的方式交换「会话秘钥」,后续就不再使用非对称加密。
  • 在通信过程中全部使用对称加密的「会话秘钥」的方式加密明文数据。

HTTPS 在 HTTP 与 TCP 层之间加入了 TLS 协议,来解决明文传输的风险,保证通信建立的安全。通信建立前需要进行TLS握手建立信任并交换「会话秘钥」:

TLS1.2四次握手过程:

image (1).png SSL/TLS 协议基本流程:

  1. 客户端向服务器索要并验证服务器的公钥。
  2. 双方协商生产「会话秘钥」。
  3. 双方采用「会话秘钥」进行加密通信。

2.1.1证书签署

数字证书的作用,是用来认证公钥持有者的身份,以防止第三方进行冒充;简单说,证书就是用来告诉客户端,服务端是否合法。

因此,服务端需要向 CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的。客户端根据 操作系统里内置的一些根证书来 验证服务端证书的真实性。

CA签发&客户端校验流程:

image (2).png

CA签发流程:

  • CA会把持有者的公钥、颁发者、用途、有效时间等信息打包,进行Hash计算;
  • CA会使用自己的私钥将该Hash值加密,对证书做签名Certificate Signature;
  • CA将Certificate Signature添加在文件证书上,形成了数字证书;

客户端校验流程:

  • 客户端使用同样的 Hash 算法获取该证书的 Hash1;
  • 客户端操作系统中集成了 CA 的证书(公钥),使用 CA 的公钥解密证书,得到 Hash2 ;
  • 客户端比较 H1 和 H2,如果值相同,则为可信赖的证书,否则证书不可信;

2.2Charles抓取https如何获取终端信任?

2.2.1客户端手动安装 Charles 的根证书

使用抓包工具进行 HTTPS 抓包的时候,需要在客户端手动安装 Charles 的根证书, 这个证书会被客户端信任。那么客户端向服务端发起 HTTPS 建立连接请求时,请求被转发到了Charles,接着Charles向服务端发起 HTTPS 建立连接请求,此时客户端与Charles进行 TLS 握手,Charles与服务端进行 TLS 握手。

image (3).png

三、使用Charles只会Map Local&Map Remote?

3.1添加断点修改响应数据

联调测试阶段or bug复现时服务端返回的数据不是你想要的怎么办?要求服务端修改或许会有点麻烦...我们可以为该请求添加断点修改响应体数据。

具体操作可参考:www.cnblogs.com/ttxcs/p/112…

3.2修改option请求解决跨域问题

3.2.1什么情况下会产生跨域?

同源:两个 URL的协议、端口、主机都相同的话,则这两个 URL是同源的。

同源策略会隔离不同源的 DOM、页面数据和网络通信,进而实现 Web 页面的安全性。不同源进行网络通信就会产生跨域问题,解决跨域问题提出了CORS (跨源资源共享) 机制。

CORS (跨源资源共享)机制允许 Web 应用服务器进行跨源访问控制,即允许服务器声明哪些源站通过浏览器有权限访问哪些资源,从而使跨源数据传输得以安全进行。

3.2.2什么是option预检请求?

CORS 机制规范要求,对那些可能对服务器数据产生副作用的 HTTP 请求方法(特别是GET以外的 HTTP 请求,或者搭配某些MIME类型的POST请求)需要进行预检请求流程。

预检请求流程:

  1. 浏览器必须首先使用OPTIONS方法发起一个预检请求,从而获知服务端是否允许该跨源请求。
  2. 服务器在预检请求的返回中,通知客户端,是否需要携带身份凭证,如Cookie和Http认证等相关数据。
  3. 浏览器确认服务器允许之后,才发起实际的 HTTP 请求。

3.2.3Charles如何修改option请求解决跨域?

在利用charles做代理工具时可以通过设置 rewrite功能,实现options请求正常响应。

具体操作可参考:blog.csdn.net/bingleihens…

结语

以上都是在使用过程中引发的思考,旨在串联整体链路,某些具体细节暂不深究。

他山之石:

1.抓包工具Charles(二)-移动端APP抓包(设置手机代理、安装证书)

2.浏览器的同源策略跨源资源共享(CORS)

3.Preflight requestOPTIONS

4.HTTP 与 HTTPS 有哪些区别