场景需求
场景 | 用途 |
---|
开发调试 | 模拟 API 响应,测试客户端逻辑(如支付失败、超时场景) |
性能优化 | 缓存静态资源,减少重复请求网络延迟 |
安全测试 | 拦截敏感数据传输,检测明文泄露或弱加密问题 |
故障排查 | 模拟服务器 5xx 错误,验证客户端容错逻辑 |
隐私保护 | 通过代理隐藏真实 IP,防止地理位置追踪 |
HTTPS 抓包原理
1. HTTPS 加密的基本原理
HTTPS 握手流程:
1. 客户端发送 ClientHello → 协商 TLS 版本和加密套件
2. 服务端返回 ServerHello + 证书 → 身份验证
3. 客户端验证证书 → 生成预主密钥(Premaster Secret)
4. 服务端解密预主密钥 → 生成对称加密密钥(Session Key)
5. 双方使用 Session Key 加密通信
关键点:
非对称加密仅用于身份验证和密钥交换,对称加密用于实际数据传输。
2. HTTPS 抓包的核心:中间人攻击(MITM)
sequenceDiagram
participant Client
participant MITM_Proxy
participant Server
Client->>MITM_Proxy: 请求 HTTPS 连接(ClientHello)
MITM_Proxy->>Client: 返回伪造证书
Client->>MITM_Proxy: 信任证书并协商密钥
MITM_Proxy->>Server: 转发请求并建立真实 HTTPS 连接
Server->>MITM_Proxy: 返回真实加密数据
MITM_Proxy->>Client: 解密后重新加密返回
必要条件:客户端必须信任代理工具的根证书(否则浏览器会提示 NET::ERR_CERT_AUTHORITY_INVALID
)。
3. 抓包工具的具体实现
工具 | 特点 |
---|
Fiddler | 图形化界面,支持断点调试和自动化脚本(FiddlerScript) |
Charles | 类似 Fiddler,支持 Map Remote/Local 和 Throttling 功能 |
mitmproxy | 命令行工具,适合自动化场景,支持 Python 脚本扩展 |
Wireshark | 底层抓包,需配合 SSLKEYLOGFILE 解密流量 |
4. 突破 HTTPS 抓包的限制
场景 1:证书绑定(Certificate Pinning)
场景 2:HTTP/2 或 HTTP/3
- 对策:确保代理工具支持最新协议(如 mitmproxy 7.0+ 支持 HTTP/2)。
场景 3:客户端检测代理
实战:mitmproxy 使用指南
1. 安装与启动
# 安装(推荐 Python 虚拟环境)
pip install mitmproxy
# 启动交互式界面
mitmproxy -p 8080 --ssl-insecure
# 启动 Web 界面(http://localhost:8081)
mitmweb
2. 代理配置
客户端类型 | 配置方法 |
---|
浏览器 | 设置 → 网络设置 → 手动代理:127.0.0.1:8080 |
Android | Wi-Fi → 修改网络 → 高级选项 → 代理手动 → 输入主机和端口 |
iOS | Wi-Fi → HTTP 代理 → 配置代理 → 手动 |
命令行工具 | 使用环境变量:
export http_proxy=http://127.0.0.1:8080 https_proxy=http://127.0.0.1:8080 |
3. 证书安装
系统 | 操作步骤 |
---|
Windows | 访问 http://mitm.it → 下载证书 → 双击安装到“受信任的根证书颁发机构” |
macOS | 下载证书 → 钥匙串访问 → 添加证书 → 设置为“始终信任” |
Android | 访问 http://mitm.it → 下载证书 → 设置 → 安全 → 加密与凭据 → 安装证书 |
iOS | 访问 http://mitm.it → 下载描述文件 → 设置 → 已下载描述文件 → 安装 |
4. 基础操作
快捷键 | 功能 |
---|
↑/↓ | 选择请求 |
Enter | 查看请求/响应详情 |
Tab | 切换请求/响应标签页 |
/ | 过滤请求(如 ~u example.com 过滤 URL) |
w | 保存会话到文件(.mitm 格式) |
5. 高级功能
脚本示例:修改请求头
# modify_headers.py
from mitmproxy import http
def request(flow: http.HTTPFlow):
flow.request.headers["X-Debug"] = "true"
脚本示例:模拟 API 响应
# mock_api.py
from mitmproxy import http
def request(flow: http.HTTPFlow):
if "api.example.com/data" in flow.request.url:
flow.response = http.Response.make(
200,
b'{"status": "success", "data": "mocked"}',
{"Content-Type": "application/json"}
)
启动命令:
mitmproxy -s modify_headers.py -s mock_api.py
6. 调试技巧
附录
工具对比
功能 | mitmproxy | Fiddler | Charles |
---|
跨平台支持 | ✔️ | ❌ (Windows) | ✔️ |
脚本扩展 | ✔️ (Python) | ✔️ (C#) | ❌ |
图形化界面 | ❌ (mitmweb 基础) | ✔️ | ✔️ |
协议支持 | HTTP/1.1, HTTP/2 | HTTP/1.1 | HTTP/1.1, HTTP/2 |
常见问题
Q1:手机无法安装证书?
- 确保已关闭“证书透明性”监控(iOS 设置 → Safari → 高级)。
- Android 7+ 需将证书安装到系统级(需 root)。
Q2:抓包时出现 TLS handshake failed
?
- 使用
--ssl-insecure
参数忽略证书错误。
- 检查客户端是否信任 mitmproxy 的根证书。