Skip to content
返回

HTTPS代理理论及实战

Published:  at  09:15

场景需求

场景用途
开发调试模拟 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

场景 3:客户端检测代理


实战:mitmproxy 使用指南

1. 安装与启动

# 安装(推荐 Python 虚拟环境)
pip install mitmproxy

# 启动交互式界面
mitmproxy -p 8080 --ssl-insecure

# 启动 Web 界面(http://localhost:8081)
mitmweb

2. 代理配置

客户端类型配置方法
浏览器设置 → 网络设置 → 手动代理:127.0.0.1:8080
AndroidWi-Fi → 修改网络 → 高级选项 → 代理手动 → 输入主机和端口
iOSWi-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. 调试技巧


附录

工具对比

功能mitmproxyFiddlerCharles
跨平台支持✔️❌ (Windows)✔️
脚本扩展✔️ (Python)✔️ (C#)
图形化界面❌ (mitmweb 基础)✔️✔️
协议支持HTTP/1.1, HTTP/2HTTP/1.1HTTP/1.1, HTTP/2

常见问题

Q1:手机无法安装证书?

Q2:抓包时出现 TLS handshake failed



上一篇文章
绕过disable-devtool限制的方法
下一篇文章
Gin避免静态资源和Api路由冲突的一种方法