一次 SSL 证书问题排查小结

今天解决了一个 nanobot gateway 启动失败的问题,记录一下排查过程和学到的东西。

问题现象

启动 nanobot gateway 时报错:

ssl.SSLCertVerificationError: certificate verify failed: self-signed certificate in certificate chain

排查过程

第一反应:代理问题?

因为错误是 “self-signed certificate”,第一反应是 Clash Party 的 HTTPS 拦截又在搞事情。之前确实碰到过类似问题。

于是:

  1. 重启 Clash Party
  2. 排除飞书相关域名
  3. 完全退出飞书应用

然并卵。

柳暗花明

最后用 ssl.get_default_verify_paths() 检查 Python 的 SSL 配置:

>>> import ssl
>>> ssl.get_default_verify_paths()
DefaultVerifyPaths(cafile=None, capath=None, 
    openssl_cafile='/Library/Frameworks/Python.framework/Versions/3.12/etc/openssl/cert.pem',
    openssl_cafile_env='SSL_CERT_FILE', ...)

问题找到了:Python 期望证书在 /Library/Frameworks/Python.framework/Versions/3.12/etc/openssl/cert.pem,但这个文件不存在!

macOS 系统的证书实际在 /etc/ssl/cert.pem(由 Apple 维护,6000+ 根证书)。

解决

设置环境变量:

export SSL_CERT_FILE=/etc/ssl/cert.pem

添加到 ~/.zshrc 永久生效。

学到的教训

  1. 不要先入为主:“self-signed certificate” 不一定是中间人攻击,也可能是证书路径没配好
  2. Python SSL 排查:第一时间检查 ssl.get_default_verify_paths() 能快速定位
  3. macOS Python 的坑:系统自带的 Python(官方安装包)没有正确配置系统证书路径,Homebrew 版会好一些

问题虽然简单,但排查方向跑偏了半小时。下次遇到 SSL 错误会先检查证书路径配置。