写这篇文章的原因是使用Charles抓包步骤较为繁琐,上手成本不低,容易遗漏某些步骤,导致抓包失败。抓包工具Fiddler同理,本文以Charles为例,可帮助理清整体逻辑流程,掌握核心要素,快速上手。
一、为什么可以拦截终端请求?
Charles作为一个中间人代理
,在客户端给服务器端发消息的时候,会截取客户端发送给服务器的请求,然后伪装成客户端与服务器进行通信;服务器返回数据时将截取的数据发送给客户端,伪装成服务器与客户端进行通信。
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四次握手过程:
SSL/TLS 协议基本流程:
- 客户端向服务器索要并验证服务器的公钥。
- 双方协商生产「会话秘钥」。
- 双方采用「会话秘钥」进行加密通信。
2.1.1证书签署
数字证书的作用,是用来认证公钥持有者的身份,以防止第三方进行冒充;简单说,证书就是用来告诉客户端,服务端是否合法。
因此,服务端需要向 CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的。客户端根据 操作系统里内置的一些根证书来 验证服务端证书的真实性。
CA签发&客户端校验流程:
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 握手。
三、使用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请求)需要进行预检请求流程。
预检请求流程:
- 浏览器必须首先使用OPTIONS方法发起一个预检请求,从而获知服务端是否允许该跨源请求。
- 服务器在预检请求的返回中,通知客户端,是否需要携带身份凭证,如Cookie和Http认证等相关数据。
- 浏览器确认服务器允许之后,才发起实际的 HTTP 请求。
3.2.3Charles如何修改option请求解决跨域?
在利用charles做代理工具时可以通过设置 rewrite功能,实现options请求正常响应。
具体操作可参考:blog.csdn.net/bingleihens…
结语
以上都是在使用过程中引发的思考,旨在串联整体链路,某些具体细节暂不深究。
他山之石: