pip 安装报 "SSL: CERTIFICATE_VERIFY_FAILED" 怎么解决
pip TLS 证书验证失败应检查时间、服务端链、系统及 pip 信任库;企业环境用核验过的 CA 配置 PIP_CERT。保持验证开启,不用 trusted-host 安装依赖。
一句话回答:先检查系统时间、实际索引/代理及证书链,再修复受信 CA。pip 24.2+ 在 Python 3.10+ 默认结合系统证书与 certifi;其他组合可能行为不同。企业 CA 应从 IT 的可信渠道获取并核对指纹,通过 PIP_CERT 或 --cert 指定。不要通过跳过 TLS 验证下载包来修复证书问题。
方案一:升级 pip 与 certifi
先用 python -m pip --version 核对版本与解释器。新版 pip 可结合系统信任库,且可能使用随 pip 分发的证书组件,升级环境中独立的 certifi 不保证修复 pip。信任链已经恢复后再执行:
python -m pip install --upgrade pip
python -m pip install --upgrade certifi
如果升级仍报 SSL 错,应先使用核验过的 CA bundle 或受控离线包恢复信任,不能跳过验证下载更新。
方案二:macOS 官方 Python 的经典坑
python.org 安装包不带系统钥匙串的证书集成,必须执行一次:
open "/Applications/Python 3.12/Install Certificates.command"
(路径按你的 Python 版本调整)。这只适用于相应 python.org 安装方式,不代表所有 macOS 报错都由它引起。
方案三:公司代理/内网环境
公司 TLS 审查代理会替换证书链,pip 看到的是企业 CA 签的证书:
# 拿到公司根证书后(IT 部门提供)
export PIP_CERT=/path/to/company-root-ca.pem
pip install requests
# 或写入 pip 配置文件 ~/.pip/pip.conf:
[global]
cert = /path/to/company-root-ca.pem
Linux 上也可以把企业根证书放进 /usr/local/share/ca-certificates/ 后 sudo update-ca-certificates,更新该发行版的系统信任库;是否被 pip 使用仍取决于其版本和 Python 环境。
不采用 --trusted-host 绕过验证
--trusted-host 会让 pip 信任证书无效甚至无 HTTPS 的指定主机,不能作为安装修复方案。请删除遗留配置中的该项,使用经核验的 CA 文件并验证正常 HTTPS 连接。
方案五:换镜像源(国内网络)
只有在组织批准该镜像并核实 HTTPS 信任后才使用;换源改变了包供应链,不能替代证书链修复。示例:
pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple
排查思路总结
| 场景 | 大概率解法 |
|---|---|
| macOS + python.org 安装包 | Install Certificates.command |
| 公司网络/代理 | 导入企业根证书(PIP_CERT) |
| 老旧系统 | 升级 pip、certifi、系统 ca-certificates |
| 仍失败 | 检查代理替换证书、CA 指纹、索引域名与 pip 实际配置 |
常见问题(FAQ)
Q:浏览器能开 PyPI,pip 却报证书错?
A:两者可能使用不同信任来源,新版 pip 也可能加载系统证书。检查 Python/pip 版本、代理、PIP_CERT 和证书链,不要只看浏览器能否打开。
Q:企业根证书能直接从报错连接里复制吗?
A:不能据此建立信任。应通过 IT 的受控渠道获取,核对指纹和适用范围;CA bundle 必须覆盖实际索引与包下载端点。
Q:Docker 镜像里报这个错?
A:精简镜像缺 CA 证书。Dockerfile 里 apt-get install -y ca-certificates(Debian 系)或 apk add ca-certificates(Alpine),并确认构建环境的网络没有 TLS 拦截。
参考资料
本文依据官方资料核对,未进行现场运行测试;代码与配置示例需结合实际版本、权限和环境验证。