为什么需要 CLI 抓包?

在开发调试 AI 编程助手、API 客户端等命令行工具时,经常需要查看其 HTTPS 请求内容。浏览器有开发者工具,但 CLI 工具的流量对开发者是"不可见"的。本文介绍如何使用 mitmproxy 在 macOS 上实现 CLI 工具的 HTTPS 抓包。

工具选择

在 macOS 上对命令行工具进行 HTTPS 抓包,免费方案首选 mitmproxy。它提供三种使用形态:

  • mitmproxy:终端交互式 UI,适合实时过滤和查看
  • mitmweb:浏览器 Web UI,JSON 自动格式化,适合内容分析
  • mitmdump:纯命令行,适合录制流量到文件或脚本处理

三者共享同一套证书和配置,按需选用即可。

安装

1
brew install mitmproxy

第一步:生成 CA 证书

首次运行会自动生成证书文件:

1
2
mitmproxy
# 看到界面后直接 q 退出

证书默认生成在 ~/.mitmproxy/

1
2
3
4
~/.mitmproxy/
├── mitmproxy-ca-cert.pem # 需要信任这个
├── mitmproxy-ca-cert.p12
└── mitmproxy-ca.pem

第二步:信任 CA 证书

1
2
3
sudo security add-trusted-cert -d -r trustRoot \
-k /Library/Keychains/System.keychain \
~/.mitmproxy/mitmproxy-ca-cert.pem

验证是否成功:打开「钥匙串访问」搜索 mitmproxy,应看到证书标记为受信任。

第三步:启动 mitmproxy

1
2
3
4
5
# 方式一:终端 UI
mitmproxy

# 方式二:Web UI(推荐,在 http://127.0.0.1:8081 查看)
mitmweb

默认监听 127.0.0.1:8080

第四步:配置代理并启动目标程序

新开一个终端:

1
2
3
4
5
export HTTP_PROXY=http://127.0.0.1:8080
export HTTPS_PROXY=http://127.0.0.1:8080
export SSL_CERT_FILE=~/.mitmproxy/mitmproxy-ca-cert.pem

opencode

第五步:验证是否有流量

在 mitmproxy/mitmweb 界面观察是否有请求进来。如果没有流量,说明目标程序没有读取代理环境变量(这在 Bun、Node.js 原生运行时中很常见)。

此时改用 proxychains 强制代理,不依赖程序自身支持:

1
brew install proxychains-ng

编辑配置文件 ~/.proxychains/proxychains.conf(没有则新建):

1
2
3
4
strict_chain
proxy_dns
[ProxyList]
http 127.0.0.1 8080

然后通过 proxychains 启动目标程序:

1
proxychains4 opencode

常见问题

TLS 握手失败 / SSL Error

如果目标程序基于 Node.js 或 Bun,SSL_CERT_FILE 可能不被识别,改用:

1
export NODE_EXTRA_CA_CERTS=~/.mitmproxy/mitmproxy-ca-cert.pem

只想把流量录制到文件

1
2
3
mitmdump -w ~/capture.mitm
# 之后用 mitmweb 回放分析
mitmweb --rfile ~/capture.mitm

只想看特定域名的请求

在 mitmproxy 界面按 f 输入过滤表达式:

1
~d openai.com

总结

场景 方案
程序正常读取代理变量 export HTTPS_PROXY + mitmproxy
程序忽略代理变量 proxychains4 + mitmproxy
只看内容不修改 mitmweb(Web UI 更直观)
脚本化修改请求 mitmproxy + Python 插件
录制留存分析 mitmdump -w

通过 mitmproxy,CLI 工具的 HTTPS 流量不再是"黑盒",调试效率大幅提升。