最近有人提醒:浏览器已经不信任某些被披露问题的证书颁发机构,但 Mac 上自带的 git、curl、python3 仍可能继续信任系统根证书;系统更新有时还会把手动删掉的根证书装回去。对普通上网这已经麻烦,对 Claude Code 更明显——代理会大量调用这些命令去拉依赖、clone 仓库、打 API。你以为「Safari 都过了」,CLI 那一层未必同一套规则。
本文在新加坡 Mac mini 上给出一套可重复的信任体检:分清浏览器与 CLI 的信任路径 → 抽查本机证书与连通性 → 把检查脚本和 Claude Code 会话固定在常开整机上。Claude 账号请使用你自己的;机器侧只提供稳定合规的使用环境。
为什么 Claude Code 把这件事抬高了
Claude Code 写代码时,很少只停留在编辑器里。典型动作包括:
git fetch/git clone:走系统或 Git 自己的 TLS 栈。curl/wget拉脚本或 release 资源。- 包管理器(
npm、pip、cargo等)背后的 HTTPS 下载。 - MCP 或钩子里再调一遍 HTTP 客户端。
这些路径往往不经过 Safari / WebKit 的信任决策。浏览器拦了某一批根证书,不等于终端里的 TLS 也拦了。代理又会在无人值守时连打几十次网络请求,误信的风险会被放大,而不是缩小。
所以体检目标不是做安全承诺,而是:在跑 Claude Code 的那台机器上,定期确认 CLI 仍按你预期在校验证书,并留下可复现的命令记录。
第一步:分清两条信任路径
在 Mac mini 上用 UU 远程连接或 SSH 登入后,先记住两套不同的世界:
- 浏览器路径:Safari 等应用可能额外不信任某些已披露问题的 CA,表现是网页打不开或证书警告。
- CLI 路径:
/usr/bin/curl、系统自带的git、以及许多 Python / Node 绑定,默认看的是系统钥匙串里的根证书与系统策略,不一定复用浏览器那套「额外不信任」名单。
不要假设「网页能开 = 终端也安全」,也不要假设「网页报错 = 终端一定拦」。两边都要测。
先确认你正在测的是哪一组工具:
which -a curl git openssl python3
curl --version | head -1
git --version
openssl version
python3 -c "import ssl; print(ssl.OPENSSL_VERSION)"
若 which 打出多条路径(Homebrew 与系统各一份),记下 Claude Code 会话里实际用的是哪一条——PATH 顺序会决定代理调到的二进制。
第二步:抽查系统根证书与已知问题 CA
在钥匙串里找根证书(只读查看,先不要批量删除):
security find-certificate -a -p /System/Library/Keychains/SystemRootCertificates.keychain \
| openssl crl2pkcs7 -nocrl -certfile /dev/stdin 2>/dev/null \
| openssl pkcs7 -print_certs -noout 2>/dev/null | head
更实用的做法是按颁发者常见名称检索。若你跟进的是某一批被公开披露的 CA 名称,用:
security find-certificate -a -c "CA名称片段" /System/Library/Keychains/SystemRootCertificates.keychain
security find-certificate -a -c "CA名称片段" /Library/Keychains/System.keychain
把输出保存到带日期的日志,例如 ~/security-audits/cert-check-$(date +%F).txt。系统大版本更新之后再跑一遍:有人遇到过「手动不信任后又被更新装回」的情况,所以更新后复检应写进清单,而不是只做一次。
对需要不信任的根证书,优先在「钥匙串访问」里将该证书的信任改为「永不信任」,或按 Apple / 你的安全基线文档操作;改完立刻用下一节的连通性命令验证 CLI 是否真的改观。避免在不了解影响面时批量删根证书——误删可能导致大量合法站点失败。
第三步:用 openssl / curl 做连通性抽查
选几个 Claude Code 常访问的 HTTPS 端点(代码托管、包仓库、模型 API 文档站等),在 Mac mini 上执行:
# 看握手与证书链(把 URL 换成你实际会访问的主机)
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \
| openssl x509 -noout -subject -issuer -dates
# curl 是否按系统策略校验证书
curl -fsSI https://example.com/ | head -5
再故意对比一次「浏览器能开、终端行为不同」的站点(若你手头有已知差异的例子)。把命令、退出码、证书 Subject/Issuer 写进同一份审计日志。Claude Code 会话里若出现证书错误,先对照这份日志,再决定是代理环境、公司代理,还是本机信任库问题——不要一上来就让模型「忽略证书错误继续」。
可选加固:给无人值守的网络脚本加上「失败即停」习惯,例如 curl -fsS(失败非零退出),并在 PreToolUse hook 里拦截带 -k / --insecure 的 curl 调用,避免代理为了省事关掉校验。
第四步:把体检写进 Claude Code 可重复流程
在常开机器上建一个小目录,例如 ~/claude-ops/cert-audit/,放入:
check.sh:上面的which、security find-certificate、若干openssl s_client/curl -fsSI。README.md:说明何时跑(每周一次、系统更新后、新装 Claude Code 后)。- 在项目或用户级
CLAUDE.md写一句:改网络或装软件后先跑 cert-audit,不要建议使用 -k 跳过 TLS。
启动 Claude Code 前(或用定时 launchd / cron)跑:
bash ~/claude-ops/cert-audit/check.sh | tee ~/security-audits/cert-check-$(date +%F-%H%M).log
会话挂在 tmux 里时,证书问题不会因为笔记本合盖而「看起来暂时没事」——问题出在 Mac mini 本机信任库,合盖也解决不了;相反,固定在一台常开整机上,你才能用同一份日志做前后对比。
和密钥泄露类问题怎么分开处理
证书信任解决的是「连出去时信不信对方」;密钥泄露解决的是「本机文件会不会被读走」。两者常被混在一次「安全打扫」里,但命令不同:
- 信任体检:本节的
security/openssl/curl。 - 密钥体检:盘点
~/.claude、.mcp.json、环境变量与钥匙串中介(站内另有 MCP 不明文存 Key、会话日志轮换等专题)。
一次排障只改一类问题,日志才可读。若审计工具报告「某些凭证文件可被 Claude Code 在无额外提示下读取」,那是权限与 deny 规则议题,不要指望靠换证书根来解决。
为什么适合放在 Zumac.Ai 的新加坡 Mac mini
证书信任、PATH 里到底是哪一份 curl、以及 Claude Code 的 hooks / CLAUDE.md,最好落在同一台少折腾的常开机器上。笔记本每换网络、每升一次系统,信任库与工具链都可能变;把仓库、审计脚本和 Claude Code 会话放在新加坡 Mac mini,用 UU 远程连接或 SSH 接回去跑同一份 check.sh,对比成本最低。
Zumac.Ai 提供新加坡 Mac mini M6 整机独享,适合长期挂着编码代理与安全体检。实际延迟取决于你本地的网络线路。
新客户整机租用 ¥999/月(季付 ¥2,697.30,半年付 6 送 1 ¥5,994,年付 12 送 2 ¥11,988);已购买客户续费保持原价。新客户首单自审核开通当天起租,续费及老客户新订单自付款当天起租。
账号始终是你自己的 Claude 账号;机器侧只提供稳定合规的使用环境,不涉及账号共享或转售。需要咨询可联系 Telegram @singatao,或查看 方案与费用。
