告别Charles!用Python神器mitmproxy在Windows/Mac上抓包,保姆级配置教程(含模拟器证书安装)
如果你厌倦了Charles的卡顿和Fiddler的复杂配置,今天介绍的mitmproxy可能会成为你的新宠。这个基于Python开发的抓包工具,不仅轻量高效,还能无缝对接Python生态,让抓包和自动化测试变得前所未有的简单。
1. 为什么选择mitmproxy?
在开发过程中,抓包工具就像开发者的"第三只眼"。传统的GUI工具如Charles虽然功能强大,但存在几个痛点:
- 资源占用高:启动慢,长时间运行容易卡顿
- 扩展性差:难以集成到自动化测试流程中
- 跨平台体验不一致:不同系统下的表现差异大
mitmproxy恰好解决了这些问题:
核心优势对比:
| 特性 | mitmproxy | Charles |
|---|---|---|
| 资源占用 | 极低 | 较高 |
| 运行方式 | 命令行/Web界面 | GUI |
| Python集成 | 原生支持 | 有限支持 |
| 跨平台 | 完全一致 | 略有差异 |
| 价格 | 开源免费 | 付费 |
提示:mitmproxy特别适合需要频繁修改请求/响应、自动化测试和批量处理数据的场景。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与安装
2.1 系统要求
确保你的系统满足以下条件:
- Windows 10/11 或 macOS 10.15+
- Python 3.8+
- 至少2GB可用内存
2.2 安装mitmproxy
推荐使用pipx安装,避免污染全局环境:
bash复制# 先安装pipx(如果尚未安装)
python -m pip install --user pipx
python -m pipx ensurepath
# 安装mitmproxy
pipx install mitmproxy
安装完成后,验证是否成功:
bash复制mitmproxy --version
2.3 安装配套工具(可选)
为了更好的开发体验,建议安装:
- mitmweb:Web界面版
- mitmdump:命令行接口
bash复制pipx inject mitmproxy mitmweb
3. 证书配置全攻略
HTTPS抓包的核心是证书配置。以下是分步指南:
3.1 生成证书
首次运行mitmproxy会自动生成证书:
bash复制mitmproxy
证书默认存储在:
- Windows:
C:\Users\<用户名>\.mitmproxy - macOS:
~/.mitmproxy
3.2 系统证书安装
Windows用户:
- 打开证书管理器:运行
certmgr.msc - 导入
mitmproxy-ca.p12到"受信任的根证书颁发机构" - 完成向导并验证安装
macOS用户:
bash复制open ~/.mitmproxy/mitmproxy-ca-cert.pem
然后在钥匙串访问中,将证书标记为"始终信任"。
3.3 模拟器证书安装
以MuMu模拟器为例:
- 将
mitmproxy-ca-cert.pem拖入模拟器共享文件夹 - 进入设置 → 安全 → 从SD卡安装
- 选择共享文件夹中的证书文件
- 命名证书并完成安装
常见问题:如果安装后仍无法抓取HTTPS,检查是否在"信任的凭据 → 用户"中能看到mitmproxy证书。
4. 实战抓包技巧
4.1 基本使用
启动监听(默认端口8080):
bash复制mitmproxy -p 8888
常用快捷键:
↑/↓:选择请求Enter:查看详情q:返回d:删除选中请求
4.2 过滤请求
只监听特定域名:
bash复制mitmproxy -p 8888 --ignore-hosts '^(?!.*example\.com).*$'
4.3 修改请求/响应
创建modify.py脚本:
python复制def request(flow):
if "example.com" in flow.request.url:
flow.request.headers["User-Agent"] = "My-Custom-UA"
def response(flow):
if flow.response.status_code == 404:
flow.response.status_code = 200
flow.response.content = b"Custom 404 Page"
运行脚本:
bash复制mitmproxy -p 8888 -s modify.py
4.4 流量保存与回放
保存会话:
bash复制mitmproxy -p 8888 -w session.mitm
回放会话:
bash复制mitmproxy -p 8888 -nr session.mitm
5. 高级应用场景
5.1 自动化测试集成
结合pytest实现自动化断言:
python复制# test_proxy.py
import pytest
@pytest.fixture
def proxy():
from mitmproxy.tools.main import mitmdump
proc = mitmdump(["-p", "8888", "-s", "modify.py"])
yield
proc.kill()
def test_api_response(proxy):
import requests
resp = requests.get("http://example.com", proxies={"http": "http://localhost:8888"})
assert "expected_content" in resp.text
5.2 移动端调试
手机配置步骤:
- 确保手机和电脑在同一局域网
- 设置手动代理:
- 服务器:电脑的局域网IP
- 端口:8888
- 访问
mitm.it安装证书
5.3 性能监控
统计请求耗时:
python复制def response(flow):
elapsed = flow.response.timestamp_end - flow.request.timestamp_start
print(f"{flow.request.url} took {elapsed:.2f}s")
6. 疑难解答
问题1:证书安装后仍无法解密HTTPS
解决方案:
- 检查证书是否在正确的存储位置
- 重启应用/模拟器
- 尝试清除系统代理设置
问题2:手机显示"无网络连接"
可能原因:
- mitmproxy未运行
- 代理设置错误
- 防火墙阻止了连接
问题3:某些应用无法抓包
原因可能是:
- 应用使用了证书固定(Certificate Pinning)
- 使用了非HTTP协议(如gRPC)
绕过方法(仅限测试环境):
python复制def request(flow):
flow.request.verify = False
7. 最佳实践建议
- 项目隔离:为每个项目创建独立的Python虚拟环境
- 脚本模块化:将常用功能封装成可复用的Python模块
- 安全注意:
- 不要在生产环境使用mitmproxy
- 定期轮换CA证书
- 性能优化:
- 使用
--no-http2禁用HTTP/2提升性能 - 避免在脚本中执行耗时操作
- 使用
bash复制# 优化后的启动命令示例
mitmproxy -p 8888 --no-http2 -s fast_script.py
8. 生态工具推荐
-
mitmproxy2swagger:自动生成API文档
bash复制
pip install mitmproxy2swagger mitmproxy2swagger -i flow.mitm -o schema.yaml -
PyPCAP:深度分析网络包
python复制from pypcap import capture for ts, pkt in capture("eth0"): print(ts, len(pkt)) -
AutoDecoder:自动解码加密内容
python复制from autodecoder import analyze analyze(flow.response.content)
在实际项目中,我发现最实用的组合是mitmproxy + pytest + Allure,可以构建完整的接口测试流水线。特别是在微服务调试时,能够快速定位是前端还是后端的问题。
