真正要做的,是让 pip 找到并信任正确的 ca 证书文件;需检查 ssl.get_default_verify_paths() 中 cafile 是否存在且有效,优先升级 certifi 并通过 pip_cert 全局指定其证书路径,企业环境还需追加私有 ca 证书。

直接跳过 SSL 验证(比如加 --trusted-host)不是解法,而是掩盖问题——真正要做的,是让 pip 找到并信任正确的 CA 证书文件。
确认是不是证书路径或证书本身失效了
运行 python -c "import ssl; print(ssl.get_default_verify_paths())",重点看 cafile 路径是否存在、是否可读。如果路径为空、指向不存在的文件,或文件内容为空/损坏,pip install 就必然失败。
- Windows 上常见情况:Python 安装包(如 Miniconda)自带
certifi,但系统 Python 没装或版本太老,cafile指向一个根本不存在的路径 - Linux/macOS 上常见情况:
cafile指向系统证书(如/etc/ssl/certs/ca-certificates.crt),但该文件未更新,或被误删 - 企业内网环境:
cafile里缺公司私有根证书,导致内部代理或镜像源无法通过验证
优先升级 certifi 并显式指定证书路径
certifi 是 Python 生态事实上的证书权威来源,它比操作系统自带证书更新更勤、覆盖更全。只要 pip 能用上它的 cacert.pem,90% 的证书失败都能解决。
- 先尝试升级:
pip install --upgrade certifi(如果这步也失败,说明当前连基础 HTTPS 都不通,需先用--trusted-host临时绕过) - 查出证书位置:
python -c "import certifi; print(certifi.where())",输出类似/path/to/site-packages/certifi/cacert.pem - 安装时强制使用:
pip install requests --cert /path/to/site-packages/certifi/cacert.pem - 设为全局生效(推荐):
export PIP_CERT=/path/to/site-packages/certifi/cacert.pem(Linux/macOS)或set PIP_CERT=C:\path\to\cacert.pem(Windows)
企业内网必须追加私有 CA 证书
只靠 certifi 不够——如果你走的是公司代理或私有 PyPI 镜像,它们的 HTTPS 证书由内部 CA 签发,certifi 默认不含这些根证书。
- 把公司提供的
.pem根证书内容,追加到certifi.where()返回的cacert.pem文件末尾(用cat internal-ca.pem >> $(python -c "import certifi; print(certifi.where())")或文本编辑器手动拼接) - 不要覆盖原文件,否则下次
certifi升级会丢失内部证书 - 追加后重启终端或重新加载 shell 配置,再试
pip install - 验证是否生效:运行
curl --cacert $(python -c "import certifi; print(certifi.where())") https://your-internal-pypi.example.com/simple/,应返回 200
禁用验证只是临时调试手段,且有明确适用边界
--trusted-host 只在两种场景下可接受:一是你完全离线、只装本地 wheel;二是你正排查代理或 DNS 问题,需要快速验证是否真为证书环节卡住。
- 绝对不要在 CI/CD、Docker 构建或生产部署脚本中写
PIP_TRUSTED_HOST环境变量 - 临时命令示例仅限单次调试:
pip install requests --trusted-host pypi.org --trusted-host files.pythonhosted.org - 若错误信息里含
unable to get local issuer certificate或self signed certificate in certificate chain,说明是证书链缺失,不是域名不匹配——此时--trusted-host无效,必须补证书
最常被忽略的一点:时间不同步也会触发同类报错。运行 date 看系统时间是否准确,误差超过 5 分钟就可能让有效证书“看起来已过期”。











