为什么需要 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

认证

如果你的代理需要基本认证,请在 URL 中包含凭证:

1
export HTTPS_PROXY=http://username:password@proxy.example.com:8080

注意:避免硬编码密码。使用环境变量或安全的凭证存储。

代理环境变量的通用性说明

上述 HTTP_PROXYHTTPS_PROXYNO_PROXY 环境变量是广泛支持的行业标准,并非 OpenCode 专属:

变量 作用 支持范围
HTTP_PROXY HTTP 请求代理 curl、wget、Python requests、Node.js(部分)、Go、Java(部分)等大多数工具
HTTPS_PROXY HTTPS 请求代理 同上,优先级高于 HTTP_PROXY
NO_PROXY 绕过代理的地址列表 同上,用于排除内网/本地地址

注意事项

  • Node.js / Bun 运行时:原生 fetch 和部分 HTTP 库可能不读取这些变量,需要使用 proxychains 强制代理(见下文)
  • Go 程序:默认支持,但需确保程序使用标准 HTTP 客户端
  • Java 程序:部分支持,可能需要通过 JVM 参数 -Dhttp.proxyHost 等配置
  • Python 程序requestsurllib 等主流库默认支持

如果目标程序正常读取代理变量,mitmproxy 界面会显示请求;如果没有流量,说明程序忽略了代理设置,此时应使用 proxychains 强制代理。

第五步:验证是否有流量

在 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 流量不再是"黑盒",调试效率大幅提升。