绝大多数 pip install 报 CERTIFICATE_VERIFY_FAILED 错误源于本地 Python 未正确使用根证书,优先升级 certifi 并设置 SSL_CERT_FILE 环境变量可解决90%场景;若仍失败,可临时用--trusted-host跳过验证,但存在安全风险。

绝大多数 pip install 报 CERTIFICATE_VERIFY_FAILED 错误,不是网络连不上,也不是 PyPI 服务器证书坏了,而是你本地 Python 没找到、没读对或根本没用上可信根证书文件。优先升级 certifi 并设置 SSL_CERT_FILE 环境变量,90% 场景能立刻解决;别急着加 --trusted-host。
为什么升级 certifi 是第一步
certifi 是 Python 生态里事实上的根证书包,它把 Mozilla 维护的最新 CA 列表打包成 cacert.pem。很多环境(尤其是 macOS 官方安装包、旧版 Miniconda、自编译 Python)自带的 certifi 版本太老,缺了 Let’s Encrypt 的 ISRG Root X1/X2 等新根证书,导致无法验证现代 HTTPS 站点。
- 运行
pip install --upgrade certifi --user(加--user更安全,避免权限问题) - 验证路径是否更新:
python -c "import certifi; print(certifi.where())",输出必须是类似.../site-packages/certifi/cacert.pem的真实路径 - 如果路径像
/Applications/Python 3.x//cacert.pem,说明还在读 macOS 安装包自带的旧证书——删掉那个目录下的cacert.pem,强制走 pip 安装的版本
必须设 SSL_CERT_FILE 环境变量
只升级 certifi 不够。Python 的 ssl 模块和 requests 默认不自动加载它,得手动绑定。这是最容易被跳过的一步。
- macOS/Linux:
export SSL_CERT_FILE=$(python -c "import certifi; print(certifi.where())") - Windows PowerShell:
$env:SSL_CERT_FILE=(python -c "import certifi; print(certifi.where())") - 为长期生效,把上面命令加到
~/.zshrc或~/.bash_profile(macOS/Linux),或用户环境变量(Windows) - 验证是否生效:
python -c "import ssl; print(ssl.get_default_verify_paths())",输出里必须包含你刚设的路径
什么时候该用 --trusted-host
--trusted-host 是临时绕过手段,适合 CI/CD 调试或内网镜像源没配证书的场景。但它不是“加在命令末尾就行”,每个要信任的域名都得单独写,且顺序要紧贴 -i 参数之后。
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
立即学习“Python免费学习笔记(深入)”;
- 用清华源举例:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn requests - PyPI 官方涉及三个域名:
pypi.org、files.pythonhosted.org、upload.pypi.org,缺一不可 - 长期使用请改配置文件:
~/.pip/pip.conf(Linux/macOS)或%APPDATA%\pip\pip.ini(Windows),每行一个trusted-host - 注意:某些 IDE(如 PyCharm)会缓存解释器配置,升级
certifi后不重启 Python 控制台,环境变量也不会生效
其他常见干扰项
如果你已做完前两步仍失败,再排查这些点:
-
HTTPS_PROXY设错:比如设成https://proxy.example.com:8080,但代理实际只支持 HTTP 协议——应改为http://proxy.example.com:8080 - 企业内网中间人代理(如 Zscaler):需导出其根证书,追加到
certifi.where()返回的cacert.pem文件末尾(用cat proxy-root.crt >> /path/to/cacert.pem) - 系统时间严重偏差:SSL 证书校验依赖准确时间,
date命令检查,必要时同步 NTP - Python 编译时未链接 OpenSSL:表现为
import ssl报错或ssl.OPENSSL_VERSION为空,需重装 Python 并指定--with-openssl
真正卡住的地方往往不是证书本身,而是 Python 没把证书路径传给底层 SSL 库——所以 ssl.get_default_verify_paths() 的输出必须检查,不能只看 certifi.where() 返回了什么。

















