mitmproxy 抓包调试实战:HTTPS 拦截与请求改写

做接口联调或排查线上问题时,一个好用的 mitmproxy 抓包 工具能让你看清每一次请求的真相。它是一款开源、跨平台、支持 HTTPS 解密的中间人代理,既能命令行交互,也能用 Python 脚本对流量做自动化改写。

一、mitmproxy 能解决什么问题

相比浏览器开发者工具只能看前端流量,mitmproxy 工作在应用层代理位置,可以拦截任意走系统代理的 HTTP/HTTPS 请求——包括移动端 App、命令行程序、微服务间调用。常见用途有:接口联调时 Mock 第三方返回、复现偶现 bug 时捕获真实报文、分析 App 的私有无文档接口。

二、安装与三种运行模式

一条命令即可安装:

# macOS / Linux
brew install mitmproxy
# 或使用 pip
pip install mitmproxy

mitmproxy 提供三种入口,按场景切换:

  • mitmproxy:终端交互界面,实时查看、过滤、重放请求。
  • mitmdump:无界面命令行,适合脚本化与服务器后台运行。
  • mitmweb:带 Web 控制台的版本,界面更接近传统抓包工具。

三、HTTPS 解密:信任 CA 证书

HTTPS 流量默认是加密的,要让 mitmproxy 看到明文,需把它的根证书安装到客户端信任链。启动一次代理后,证书会自动生成:

# 浏览器访问该地址即可下载 CA 证书
http://mitm.it

# 或直接从配置目录取出
open ~/.mitmproxy/mitmproxy-ca-cert.pem

把证书导入系统钥匙串并设为”始终信任”,再将客户端代理指向 127.0.0.1:8080,即可看到解密后的明文请求。服务器侧的加固思路可参考我们的服务器安全加固实战

四、用 Python 插件自动化改写流量

mitmproxy 的真正威力在于用 Python 脚本接管请求与响应。下面这个插件在请求发出前注入调试头,并在响应返回后改写状态码与正文:

from mitmproxy import http

class RewriteTraffic:
    def request(self, flow: http.HTTPFlow):
        # 发出前注入自定义请求头
        flow.request.headers["X-Debug"] = "mitmproxy"

    def response(self, flow: http.HTTPFlow):
        # 对特定接口改写返回体
        if "api/order" in flow.request.pretty_url:
            flow.response.status_code = 200
            flow.response.text = '{"mock": true, "data": []}'

addons = [RewriteTraffic()]

mitmdump -s rewrite.py 加载即可生效。结合API 调试工具选型API 文档生成,可以搭建一套从抓包、Mock 到文档的闭环。

五、两个高频实战场景

场景一:Mock 第三方接口

联调时第三方服务不稳定?用上面的 response 钩子直接返回固定报文,本地开发不再被外部依赖卡住,也不污染真实环境。

场景二:排查移动端 HTTPS 流量

手机和电脑连同一 Wi-Fi,把手机代理设为电脑 IP:8080 并安装 CA 证书,就能在终端里看到 App 的全部请求,快速定位”为什么这个接口 403″。前端在浏览器侧的安全防护可对照前端安全 XSS/CSRF 防御

六、常用命令速查

命令作用
mitmproxy -p 8080在 8080 端口启动交互代理
mitmdump -s a.py后台运行并加载脚本 a.py
mitmproxy -r flow.log回放已保存的流量文件
~/.mitmproxy/mitmproxy-ca-cert.pem导出的 CA 根证书路径

七、与同类工具对比

工具收费脚本化适用
mitmproxy免费开源强(Python)开发者、自动化
Charles商业图形化调试
Fiddler免费/商业中(FiddlerScript)Windows 生态

八、小结

mitmproxy 把”看流量”和”改流量”合二为一:HTTPS 解密让你看清报文,Python 插件让流量改写可编程、可复用。把它接入GitHub Actions 流水线,还能在 CI 中做接口契约校验。掌握它,接口联调与排障效率会明显上一个台阶。

上一篇 LLM 流式输出实战:SSE 推流与前端渲染
下一篇 React Server Components 实战:从 CSR 到 RSC 的渲染范式变革