---
title: HTTPS代理理论及实战
pubDatetime: 2025-02-12T09:15:06+8:00
description: HTTPS代理理论及实战
slug: https-proxy
tags:
- HTTPS代理
- 中间人攻击
---

## 场景需求
| **场景**        | **用途**                                                                 |
|----------------|-------------------------------------------------------------------------|
| 开发调试        | 模拟 API 响应，测试客户端逻辑（如支付失败、超时场景）                     |
| 性能优化        | 缓存静态资源，减少重复请求网络延迟                                       |
| 安全测试        | 拦截敏感数据传输，检测明文泄露或弱加密问题                               |
| 故障排查        | 模拟服务器 5xx 错误，验证客户端容错逻辑                                  |
| 隐私保护        | 通过代理隐藏真实 IP，防止地理位置追踪                                    |

<!-- more -->

---

## HTTPS 抓包原理

### 1. HTTPS 加密的基本原理
```plaintext
HTTPS 握手流程：
1. 客户端发送 ClientHello → 协商 TLS 版本和加密套件
2. 服务端返回 ServerHello + 证书 → 身份验证
3. 客户端验证证书 → 生成预主密钥（Premaster Secret）
4. 服务端解密预主密钥 → 生成对称加密密钥（Session Key）
5. 双方使用 Session Key 加密通信
```

**关键点**：  
非对称加密仅用于身份验证和密钥交换，对称加密用于实际数据传输。

---

### 2. HTTPS 抓包的核心：中间人攻击（MITM）
```mermaid
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）
- **原理**：应用内置服务器证书指纹，拒绝信任系统证书。
- **绕过方案**：
  ```bash
  # Android 使用 Frida 绕过（需 root）
  frida -U -f com.example.app -l bypass_ssl_pinning.js
  ```

#### 场景 2：HTTP/2 或 HTTP/3
- **对策**：确保代理工具支持最新协议（如 mitmproxy 7.0+ 支持 HTTP/2）。

#### 场景 3：客户端检测代理
- **透明代理方案**：
  ```bash
  # Linux 使用 iptables 重定向流量
  iptables -t nat -A OUTPUT -p tcp --dport 443 -j REDIRECT --to-port 8080
  ```

---

## 实战：mitmproxy 使用指南

### 1. 安装与启动
```bash
# 安装（推荐 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 代理 → 配置代理 → 手动                                         |
| 命令行工具    | 使用环境变量：<br>`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. 高级功能

#### 脚本示例：修改请求头
```python
# modify_headers.py
from mitmproxy import http

def request(flow: http.HTTPFlow):
    flow.request.headers["X-Debug"] = "true"
```

#### 脚本示例：模拟 API 响应
```python
# 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"}
        )
```

**启动命令**：
```bash
mitmproxy -s modify_headers.py -s mock_api.py
```

---

### 6. 调试技巧
- **实时日志**：通过 `mitmdump -v` 查看详细日志。
- **过滤噪声**：使用 `-I` 参数忽略指定域名：
  ```bash
  mitmproxy -I ".*google.*"
  ```
- **性能分析**：按 `m` 标记请求，按 `M` 查看统计信息（如响应时间分布）。

---

## 附录

### 工具对比
| **功能**         | 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 的根证书。