根本原因是Python默认使用certifi的cacert.pem而非系统证书库,旧版certifi缺失ISRG Root X1/X2等新根证书,导致无法验证Let’s Encrypt签发的pypi.org等站点证书;应升级certifi并验证pip debug --verbose中cert_path是否生效。

根本原因不是网络不通,而是 Python 无法验证服务器的 TLS 证书链 —— 它找不到可信的根证书,或找到的证书已过期、不完整。
pip 默认用 certifi 的 cacert.pem,而不是系统证书库
Windows/macOS 上的 Python 预编译包(包括官方安装包、Miniconda、Homebrew Python)默认不读取操作系统自带的证书(如 macOS Keychain 或 Windows 证书存储),而是依赖 certifi 包提供的 cacert.pem。这个文件是 Mozilla 维护的公开 CA 列表快照,但一旦过期或没及时更新,就会校验失败。
- 运行
python -c "import certifi; print(certifi.where())"查看当前实际加载的证书路径 - 旧版
certifi(比如 2022 年前的版本)不含 ISRG Root X1/X2,会导致 Let’s Encrypt 签发的新站(包括 pypi.org)校验失败 - Linux 发行版 Python 通常走
/etc/ssl/certs,但 pip 仍可能因环境变量或配置覆盖而 fallback 到 certifi
常见触发场景和对应表现
报错本身不说明具体原因,得结合上下文判断:
-
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] unable to get local issuer certificate→ 本地缺中间证书或根证书未被识别 -
Could not fetch URL https://pypi.org/simple/xxx/: There was a problem confirming the ssl certificate→ pip 连上了,但 SSL 握手阶段被拒绝 - 只在公司内网/教育网/某些云主机上出错 → 很可能是代理中间人(MITM)注入了私有根证书,而 Python 没加载它
- 升级 Python 后突然出错 → 新 Python 版本没自动带新
certifi,或旧版本残留配置干扰
为什么 --trusted-host 只能临时用
这个参数本质是关闭对某个域名的证书链校验,不验证签名、不检查有效期、不比对域名,等于把 HTTPS 降级为 HTTP + 自定义 Host 头。
模板驱动的多平台内容流水线,面向独立 iOS 开发者,自动生成并排期一周的社交媒体帖子(TikTok、YouTube Shorts、X/Twitter...)
- 命令中必须写成
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn requests,--trusted-host要紧贴源地址之后,否则无效 - 如果镜像站本身又重定向到
pypi.org或files.pythonhosted.org,你还得额外加两个--trusted-host - CI/CD 流水线里硬编码这些参数,容易漏配、难审计,且一旦镜像站证书更新(比如换域名或切 CDN),会静默失效
真正该做的三件事
修复证书路径才是可持续解法,重点在于让 Python 实际加载到一份有效的证书 bundle:
- 先升级
certifi:pip install --upgrade certifi(若 pip 本身连不上,可手动下载 wheel 后离线安装) - 确认生效:
pip debug --verbose查看输出里的cert_path是否指向你刚升级的cacert.pem - 若公司用自建 CA,把内部 PEM 文件追加到
certifi.where()返回的文件末尾(用>>或文本编辑器),不要替换原文件
最常被忽略的是:IDE(如 PyCharm)或 shell 环境可能缓存旧解释器配置,改完证书后不重启终端或重载解释器,certifi.where() 看起来变了,实际加载的还是旧路径。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










