定义
mitmproxy是一套免费且开源的交互式 HTTPS 代理工具,可以在客户端与服务器之间中转网络流量,并对经过的请求与响应进行查看、修改和重放[1][4]。它支持 HTTP/1、HTTP/2、HTTP/3、WebSockets 以及其他受 SSL/TLS 保护的协议,并能对 HTML、Protobuf 等多种消息格式进行美化和解码[1]。
项目名称中的「mitm」是「Man-In-The-Middle」(中间人)的缩写,指其在流量通路中同时扮演客户端与服务器两端角色的工作方式[5]。该工具属于自由软件,采用 MIT 许可证发布,源代码托管在 GitHub 上[6]。
原理
对于未加密的 HTTP 流量,mitmproxy 以常规显式代理的方式工作:客户端把请求发往代理,代理再向目标服务器转发,因此代理能够直接读取请求内容[5]。对于 HTTPS 流量,客户端通常先发出 CONNECT 请求,要求代理在客户端与服务器之间建立一条数据通道;普通代理只能盲目转发这段加密数据,无法获知其内容[5]。
mitmproxy 的解决方式是让自身充当一个受信任的证书颁发机构:它内建完整的 CA 实现,在连接过程中即时签发用于拦截的证书,分别与客户端和服务器建立两条独立的 TLS 连接,从而对两侧明文进行解码[5]。要让客户端接受这些证书,需要手动把 mitmproxy 的根证书登记为设备上的受信任 CA[5]。
生成拦截证书时需要知道目标域名,但客户端有时只提供 IP 地址。为此 mitmproxy 采用上游证书嗅探:收到 CONNECT 请求后先暂停与客户端的会话,同时连向服务器完成 TLS 握手并检查其证书,再以证书中的 Common Name 生成出示给客户端的证书[5][7]。若证书还带有 Subject Alternative Name 字段,其中的备用域名也会一并提取并加入生成的证书[5]。针对服务器名称指示(SNI)扩展,处理流程会等客户端握手传出 SNI 值后再向该主机名发起上游连接,以取得正确的服务器证书[5]。
mitmproxy 默认以常规 HTTP 代理模式启动,监听本机 8080 端口,需要浏览器或其他设备把流量指向该端口才能生效[4]。除默认模式外,它还提供透明代理、反向代理和上游代理等运行方式;其中透明代理在网络层把连接重定向到代理,无需修改客户端配置,但要求通过路由机制还原连接的原始目标地址[5]。mermaid 图示意显式 HTTPS 拦截流程:
sequenceDiagram
participant C as 客户端
participant M as mitmproxy
participant S as 服务器
C->>M: CONNECT 目标主机
M->>S: 建立 TLS 连接并读取证书
S-->>M: 返回证书(CN/SAN)
M->>C: 出示即时签发的拦截证书
C->>M: 发送加密请求
M->>S: 转发明文请求
发展历程
mitmproxy 由开发者 Aldo Cortesi 创建,其版权声明可追溯至 2010 年,早期版本以命令行加控制台界面的形式提供,功能包括拦截并修改 HTTP 请求与响应、保存完整会话以供重放和分析,以及用 Python 脚本改动流量[8][9]。0.8 版本时期,项目运行需要 Python 2.6 或 2.7,并曾明确不支持 Windows 系统[9]。
项目随后转向 Python 3,并要求至少 3.6 版本,后续版本的要求进一步提高到 3.12。许可证方面,早期发行版采用 GNU 通用公共许可证第 3 版,并附带针对 OpenSSL 库的链接例外;后来的仓库许可证改为 MIT 许可证[8][6]。项目维护工作后来由 Maximilian Hils 等人接手。
mitmproxy 被收录进多个主流 Linux 发行版的软件仓库,例如 Debian 与 Ubuntu 都提供名为 mitmproxy 的软件包,其定位描述为「具备 SSL 能力的中间人 HTTP 代理」[10]。它同时通过 Python 包索引发布,可以借助包管理工具安装[11]。
应用
mitmproxy 的常见用途包括软件调试与测试、隐私测量和渗透测试[1]。开发人员用它了解应用程序与其他服务之间的接口交互,安全研究人员用它分析网络协议,测试人员用它构造边界情况与错误条件[3]。由于可以修改请求和响应内容,它也常被用于构造模拟数据和验证接口在不同参数下的行为[12]。
3 个核心工具面向不同使用场景:mitmproxy 是带控制台的交互式界面,所有会话保存在内存中,适合处理规模较小的样本;mitmweb 提供浏览器中的图形界面,用法接近 Chrome 开发者工具的抓包面板;mitmdump 是非交互的命令行程序,可输出到终端并支持脚本处理,功能定位类似针对 HTTP 的 tcpdump[2][1]。
mitmproxy 提供 Python 脚本接口,可以加载自定义脚本或插件,对流量执行自动化改动,例如修改请求头、重定向流量、将消息可视化或实现自定义命令;mitmdump 还可以把流量写入文件,之后再读取并重放给客户端或服务器[1][2]。由于其脚本能力可实现过滤、篡改、重放和自动化,被广泛用于接口自动化测试流程[12][13]。
局限
mitmproxy 解密 HTTPS 的前提是目标设备信任其根证书,若证书未正确安装或未被设为受信任根证书,流量会保持加密状态或连接直接中断[14]。自 Android 7 起,应用默认不再信任用户自行安装的 CA 证书,因此即使证书已装入系统,目标应用仍可能忽略它[14][13]。
部分应用会实施证书固定(Certificate Pinning),即在程序内硬编码所接受的证书或公钥指纹,使任何由其他 CA 签发的证书都会被拒绝[15]。这类机制会直接导致 mitmproxy 看不到明文流量,代理工具本身不提供绕过能力[13]。Chromium 浏览器也已禁止固定自签名根证书的证书链,使 mitmproxy、Fiddler 等抓包工具无法再利用自签证书嗅探加密内容[16]。
在透明代理模式下,mitmproxy 依赖路由机制还原原始目标地址,因此流量到达代理主机前不应施加网络地址转换,否则目标信息会丢失[5]。此外,控制台版本的 mitmproxy 不支持 Windows 系统,Windows 环境下只能使用其命令行或网页界面形式[12]。
参见
参考资料
- mitmproxy is a free and open source interactive HTTPS proxy [引用日期2026-10-14]
- Introduction [引用日期2026-10-14]
- Introduction [引用日期2026-10-14]
- MASTG-TOOL-0097: mitmproxy [引用日期2026-10-14]
- How mitmproxy works [引用日期2026-10-14]
- LICENSE [引用日期2026-10-14]
- Upstream Certificates¶ [引用日期2026-10-14]
- Copyright for mitmproxy source package in Trusty [引用日期2026-10-14]
- mitmproxy is an SSL-capable man-in-the-middle proxy for HTTP [引用日期2026-10-14]
- 软件包: mitmproxy (6.0.2-1) [universe] [引用日期2026-10-14]
- mitmproxy [引用日期2026-10-14]
- Mock 工具与定制化 [引用日期2026-10-14]
- Python抓包工具怎么选_Fiddler/Charles/Mitmproxy抓取手机App HTTPS流量包 [引用日期2026-10-14]
- Mitmproxy如何捕获HTTPS流量? - CodeMaster 2025-12-01 02:30 采纳率: 99% [引用日期2026-10-14]
- mimic/docs/pinning.md at main · littledivy/mimic [引用日期2026-10-14]
- [科普中国]-HTTP公钥固定 [引用日期2026-10-14]