pip--CERTIFICATE_VERIFY_FAILED

摘要

  • 测试环境:macOS 13.7.1,Python 3.11.3
  • 今天将pip升级(pip install --upgrade pip)到24.3.1版本后,通过pip install命令安装依赖时会报错,比如:
1
2
$ pip install certifi
Could not fetch URL https://pypi.org/simple/certifi/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/certifi/ (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1002)'))) - skipping
  • 很奇怪,从pip自己的网站上下载依赖都会出现证书无法验证的错误。测试了一下,该问题只在macOS上遇到,其他平台没有遇到过。
  • 先说结论,推荐使用第五种方法。

解决方法

1. --trusted-host: 忽略证书验证

  • 指定信任的证书域名,从而不进行验证证书,可以指定多个

1
pip install certifi --trusted-host pypi.org --trusted-host files.pythonhosted.org

2. --cert: 指定证书文件

  • 此时需要先下载证书文件,用Chrome浏览器打开https://pypi.org,按如下步骤导出证书文件



  • 然后再执行如下命令进行安装

1
pip install certifi --cert ~/Downloads/GlobalSign.pem

3. pip.conf: 配置全局证书文件

  • 还是需要先下载证书文件,参考上面方法

  • pip 的配置文件位置因操作系统而异。可以通过以下命令找到配置文件路径:

1
2
3
4
5
6
# 我使用的是 macOS
$ pip config -v list
For variant 'global', will try loading '/Library/Application Support/pip/pip.conf'
For variant 'user', will try loading '/Users/hanqf/.pip/pip.conf'
For variant 'user', will try loading '/Users/hanqf/.config/pip/pip.conf'
For variant 'site', will try loading '/Library/Frameworks/Python.framework/Versions/3.11/pip.conf'
  • pip会从上面的路径中查找配置信息,我这里选择第二个,如果不存在就创建~/.pip/pip.conf文件,内容如下:

1
2
[global]
cert = ~/Downloads/GlobalSign.pem
  • 配置好后可以通过如下命令查看配置信息

1
2
$ pip config list
global.cert='~/.pip/GlobalSign.pem'
  • 然后再执行如下命令进行安装

1
pip install certifi

4.将证书添加到系统信任的证书存储

对于 macOS:

我设置后依旧报错,暂不清楚原因

  • 打开 钥匙串访问 应用程序,并选择 系统钥匙串 中的 系统 (从网上查询说是要加入系统根证书,但是我没有加入成功)

  • 文件导入项目选择证书文件

  • 会提示你输入密码,如果证书不受信任,可以将证书设置为为始终信任该证书 (双击证书 》 信任 》 使用此证书时 》设置为始终信任)。

5.使用 Python 官方推荐的证书修复工具 (推荐)

  • 这个方法最简单

  • 运行这个脚本前需要先安装 certifi,其主要用于提供权威的CA根证书列表

1
$ pip install certifi --trusted-host pypi.org --trusted-host files.pythonhosted.org
  • 运行证书安装脚本(适用于 macOS 内置的 Python)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 首次运行依旧会报错,但实际上已经进行了修复,主要就是最后4步进行的操作
# 注意替换你自己的Python版本号
$ /Applications/Python\ 3.11/Install\ Certificates.command

-- pip install --upgrade certifi
Requirement already satisfied: certifi in /Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages (2024.8.30)
WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1002)'))': /simple/certifi/
WARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1002)'))': /simple/certifi/
WARNING: Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1002)'))': /simple/certifi/
WARNING: Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1002)'))': /simple/certifi/
WARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1002)'))': /simple/certifi/
Could not fetch URL https://pypi.org/simple/certifi/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/certifi/ (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1002)'))) - skipping
-- removing any existing file or link
-- creating symlink to certifi certificate bundle
-- setting permissions
-- update complete
  • 之后再运行pip install命令,就不会报错了

6.使用其它镜像源

  • 该问题是因为Pypi软件仓库官网的证书文件存在问题导致的,只要我们不从官网下载就不会有问题。

  • 在国内为了加速下载我们一般会使用国内的镜像源,例如阿里云的Pypi镜像源或者清华大学的Pypi镜像源,具体使用方法参考各自的官网说明即可。