一、先搞懂:正常 HTTPS 为什么抓不到明文?
正常 HTTPS 流程:
- 客户端 ↔ 服务器 TCP 三次握手
- TLS 握手:协商加密套件、交换随机数、下发服务器证书、校验证书、协商会话密钥
- 后续所有业务数据 AES 对称密文传输
关键点:
- 服务器证书由 权威 CA 签名
- 客户端系统内置根证书,能校验服务器证书合法性
- 链路全程加密,中间人只能抓到乱码密文,无法解密、无法篡改
结论:正常无配置情况下,HTTPS 天然防窃听、防篡改,抓包工具只能看到加密字节流。
二、HTTPS 抓包核心本质:中间人攻击(MITM)
1. 抓包工具角色
Charles / Fiddler / Mitmproxy 本质都是:中间人代理不再是 客户端 ↔ 服务器变成:客户端 ↔ 抓包工具 (中间人) ↔ 真实服务器
2. 完整中间人逻辑
- 客户端的所有网络请求,都转发到抓包代理
- 中间人冒充真实服务器,给客户端返回自己伪造的证书
- 中间人再以客户端身份,和真实服务器建立正规 HTTPS 连接
- 中间人一边解密客户端流量、一边加密转发给服务器
- 双向解密解密后,抓包工具就能看到完整明文
核心:拆成两段 TLS 会话客户端 ↔ 中间人(自签名证书)中间人 ↔ 真实服务器(正规 CA 证书)
三、抓包必备两步:配置代理 + 安装根证书
第一步:手机配置 WiFi 代理
把手机 WiFi 的HTTP 代理指向电脑 IP + 抓包端口(如 8888)
作用:
- 手机所有 HTTP/HTTPS 请求,不再直接走公网
- 全部流量强制转发到电脑抓包工具
- 没有代理配置,流量走正常路由,中间人截不到任何数据
第二步:手机安装抓包工具根证书(最关键)
1. 为什么必须装根证书?
正常 HTTPS 校验逻辑:客户端收到服务器证书 → 用系统内置根证书校验 CA 签名 → 合法才允许建立 TLS 连接
抓包时:Charles/Fiddler 给手机返回的是自己生成的自签名伪证书系统默认根证书不认可这个伪证书 → 直接判定不安全 → 断开连接、抓包失败
安装根证书的作用:把抓包工具的根证书加入手机系统信任列表手机后续看到中间人伪造的证书,会认为是合法可信 CA 颁发,允许 TLS 握手通过,不报错、不拦截。
2. 证书安装层级区别
- 仅安装到描述文件(iOS) :普通 APP 可抓包;iOS 15+ 部分 APP 要求系统信任根证书
- 安装到系统根证书目录:全局信任,几乎所有 APP 都能抓包
- 安卓:安装为 系统 CA 才可全局抓包,用户 CA 会被 APP 绕过校验
四、抓包内部完整实现细节(一步不落)
流程总览
- 手机设置 WiFi 代理,流量导流到电脑抓包工具
- 客户端发起 HTTPS 请求
- 抓包工具拦截请求,与真实服务器建立正规 TLS 连接
- 抓包工具生成仿域名自签名证书,下发给手机
- 手机用已安装的中间人根证书,校验伪证书合法
- 客户端与中间人完成 TLS 握手,协商出会话密钥
- 客户端发的加密数据 → 中间人解密出明文 → 再加密转发给真实服务器
- 服务器响应密文 → 中间人解密明文 → 再加密返回手机
- 抓包工具全程持有双向明文,实现抓包、篡改、重发
关键细节拆解
1. 代理导流原理
WiFi 代理是 应用层代理,手机网络栈在发起 HTTP/HTTPS 时,优先把请求发给代理地址,而非 DNS 解析后的真实服务器 IP。
2. 抓包工具如何伪造证书?
Charles/Fiddler 本地内置一套 自签名根证书 + 私钥当访问 https://xxx.com 时:
- 工具动态生成一张 域名是 xxx.com 的叶子证书
- 用自己的根证书对这张叶子证书签名
- 返回给手机
手机因为已信任中间人根证书,校验签名通过,误以为就是官方证书。
3. 两段 TLS 会话细节
- 正向:手机 <-> Charles:使用中间人自签名证书,信任后建立加密通道
- 反向:Charles <-> 真实服务器:使用官方正规 CA 证书,完全遵循标准 HTTPS中间人充当「翻译官」,一边解密、一边加密转发。
4. 为什么能看到明文?
两段 TLS 密钥完全独立,中间人同时持有两段会话的对称密钥:
- 可以解密手机发过来的密文,拿到原始请求明文
- 可以解密服务器返回的密文,拿到响应明文因此抓包工具可以展示、篡改、断点、重放。
五、HTTPS 双向认证:普通抓包彻底无法突破
1. 单向认证(普通 HTTPS)
只做:客户端校验服务器证书
- 我们平时网站、APP 都是单向认证
- 只要装中间人根证书,就能完美抓包
2. 双向认证(Mutual TLS /mTLS)
要求:
-
客户端校验服务器证书(和普通一样)
-
服务器强制校验客户端证书
- APP 内置专属客户端证书 + 私钥
- TLS 握手时,客户端必须主动把自己证书发给服务器
- 服务器用内置根证书校验客户端合法性
3. 为什么双向认证抓不了?
- 抓包中间人可以伪造服务器证书
- 但无法伪造客户端证书和私钥(私钥固化在 APP / 安全芯片,不对外泄露)
- 中间人代替手机和服务器建连时,拿不出合法客户端证书
- 服务器直接断开 TLS 握手,拒绝连接普通 Charles/Fiddler 完全无法中间人解密
4. 哪些 APP 用双向认证?
银行、支付、金融、证券、大厂敏感接口、企业内网服务,普遍 mTLS 双向认证,防抓包、防篡改、防爬虫。
六、APP 防抓包常用手段(延伸)
- mTLS 双向证书认证(最彻底)
- APP 代码内禁用系统自定义根证书,只信任内置官方 CA
- 检测设备是否安装可疑根证书、是否开启代理
- 证书 Pinning(SSL Pinning):APP 硬编码服务器公钥 / 证书,只认固定证书,中间人伪证书直接拒绝
- 协议层加密:HTTPS 之上再套一层业务私有加密,即使抓到明文也看不懂
七、总结
- HTTPS 抓包本质是中间人攻击,把客户端和服务器直连拆成「客户端 - 中间人 - 服务器」两段 TLS 会话;
- 抓包必须两步:配置 WiFi 代理导流流量 + 安装中间人根证书让系统信任伪造证书;
- 抓包工具动态生成目标域名自签名证书,用自身根证书签名,手机信任后 TLS 握手正常建立,中间人可双向解密获取明文;
- HTTPS 双向认证 (mTLS) 要求服务器校验客户端专属证书与私钥,中间人无法伪造客户端证书,普通抓包完全无法突破;
- 证书 Pinning、禁用第三方根证书、代理检测都是 APP 常用防抓包方案。