关于python:pip install失败,出现“连接错误:[SSL:CERTIFICATE_VERIFY_FAILED]证书验证失败(_ssl.c:598)”

pip install fails with “connection error: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:598)”

我对python非常陌生,尝试在Windows7上使用> pip install linkchecker。一些注释:

  • 无论软件包是什么,PIP安装都会失败。例如,> pip install scrapy也会导致SSL错误。
  • python 3.4.1的普通安装包括pip 1.5.6。我尝试做的第一件事是安装LinkChecker。python 2.7已经安装,它附带了Arcgis。在我安装3.4.1之前,命令行没有提供pythonpip
  • > pip search linkchecker工程。也许这是因为PIP搜索不验证站点的SSL证书。
  • 我在一家公司的网络中,但我们不通过代理来连接互联网。
  • 每个公司计算机(包括我的)都有一个受信任的根证书颁发机构,用于各种原因,包括启用到https://google.com的TLS流量监控。不确定这与否有关。

下面是运行pip install linkchecker后pip.log的内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Downloading/unpacking linkchecker
  Getting page https://pypi.python.org/simple/linkchecker/
  Could not fetch URL https://pypi.python.org/simple/linkchecker/: connection error: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:598)
  Will skip URL https://pypi.python.org/simple/linkchecker/ when looking for download links for linkchecker
  Getting page https://pypi.python.org/simple/
  Could not fetch URL https://pypi.python.org/simple/: connection error: HTTPSConnectionPool(host='pypi.python.org', port=443): Max retries exceeded with url: /simple/ (Caused by <class 'http.client.CannotSendRequest'>: Request-sent)
  Will skip URL https://pypi.python.org/simple/ when looking for download links for linkchecker
  Cannot fetch index base URL https://pypi.python.org/simple/
  URLs to search for versions for linkchecker:
  * https://pypi.python.org/simple/linkchecker/
  Getting page https://pypi.python.org/simple/linkchecker/
  Could not fetch URL https://pypi.python.org/simple/linkchecker/: connection error: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:598)
  Will skip URL https://pypi.python.org/simple/linkchecker/ when looking for download links for linkchecker
  Could not find any downloads that satisfy the requirement linkchecker
Cleaning up...
  Removing temporary dir C:\Users\jcook\AppData\Local\Temp\pip_build_jcook...
No distributions at all found for linkchecker
Exception information:
Traceback (most recent call last):
  File"C:\Python34\lib\site-packages\pip\basecommand.py", line 122, in main
    status = self.run(options, args)
  File"C:\Python34\lib\site-packages\pip\commands\install.py", line 278, in run
    requirement_set.prepare_files(finder, force_root_egg_info=self.bundle, bundle=self.bundle)
  File"C:\Python34\lib\site-packages\pip
eq.py"
, line 1177, in prepare_files
    url = finder.find_requirement(req_to_install, upgrade=self.upgrade)
  File"C:\Python34\lib\site-packages\pip\index.py", line 277, in find_requirement
    raise DistributionNotFound('No distributions at all found for %s' % req)
pip.exceptions.DistributionNotFound: No distributions at all found for linkchecker


通过将pypi.orgfiles.pythonhosted.org设置为受信任主机,可以忽略SSL错误。

1
$ pip install --trusted-host pypi.org --trusted-host files.pythonhosted.org <package_name>

注:在2018年4月的某个时候,python包索引从pypi.python.org迁移到pypi.org。这意味着使用旧域的"受信任主机"命令不再有效。

永久固定

由于PIP 10.0的发布,您应该能够通过升级pip本身来永久地解决这个问题:

1
$ pip install --trusted-host pypi.org --trusted-host files.pythonhosted.org pip setuptools

或者只需重新安装即可获得最新版本:

1
$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py

(然后使用相关的python解释器运行get-pip.py)。

之后,pip install 就可以工作了。如果没有,那么您需要做更多,如下所述。

您可能需要将受信任的主机和代理添加到配置文件中。

pip.inipip.confUnix

1
2
3
4
[global]
trusted-host = pypi.python.org
               pypi.org
               files.pythonhosted.org

替代解决方案(不太安全)

大多数答案都可能造成安全问题。

帮助轻松安装大多数python包的两个解决方法是:

  • 使用简易安装:如果你真的很懒惰,不想浪费太多时间,使用easy_install 。请注意,有些包找不到或会出现小错误。
  • 使用wheel:下载python包的wheel并使用pip命令pip install wheel_package_name.whl安装包。


可以使用此参数指定证书:

1
pip --cert /etc/ssl/certs/FOO_Root_CA.pem install linkchecker

看到了吗?参考指南?匹普

如果指定您公司的根证书不起作用,那么curl-one可能会起作用:http://curl.haxx.se/ca/cacert.pem

您必须使用PEM文件而不是CRT文件。如果您有一个CRT文件,您将需要将该文件转换为PEM,在注释中有报告说,这现在可以与一个CRT文件一起使用,但我还没有验证。

另请检查:SSL证书验证。


Kenorb的回答非常有用(非常好!).在他的解决方案中,也许这是最简单的一个:--trusted-host

例如,在这种情况下,您可以

1
pip install --trusted-host pypi.python.org linkchecker

PEM文件(或其他任何文件)是不必要的。


答案很相似,有点混乱。在我的案例中,我公司网络中的证书就是问题所在。我可以用以下方法解决这个问题:

1
pip install --trusted-host files.pythonhosted.org --trusted-host pypi.org --trusted-host pypi.python.org oauthlib -vvv

如这里所见。如果不需要详细输出,则可以省略-vvv参数


我发现最简单的方法是从digicert下载并使用"digicert high assurance ev root ca",网址为:https://www.digicert.com/digicert root certificates.htm roots

您可以访问https://pypi.python.org/通过单击地址栏中的锁定图标来验证证书颁发者,或者通过使用openssl来增加您的geek cred:

1
2
3
4
5
6
7
8
9
10
11
$ openssl s_client -connect pypi.python.org:443
CONNECTED(00000003)
depth=1 /C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert SHA2 Extended Validation Server CA
verify error:num=20:unable to get local issuer certificate
verify return:0
---
Certificate chain
 0 s:/businessCategory=Private Organization/1.3.6.1.4.1.311.60.2.1.3=US/1.3.6.1.4.1.311.60.2.1.2=Delaware/serialNumber=3359300/street=16 Allen Rd/postalCode=03894-4801/C=US/ST=NH/L=Wolfeboro,/O=Python Software Foundation/CN=www.python.org
   i:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert SHA2 Extended Validation Server CA
 1 s:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert SHA2 Extended Validation Server CA
   i:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert High Assurance EV Root CA

证书链中的最后一个cn值是需要下载的CA的名称。

对于一次性工作,请执行以下操作:

  • 从Digicert下载CRT
  • 将CRT转换为PEM格式
  • 将PIP CERT环境变量导出到PEM文件的路径
  • (最后一行假设您正在使用bash shell)在运行pip之前。

    1
    2
    3
    curl -sO http://cacerts.digicert.com/DigiCertHighAssuranceEVRootCA.crt
    openssl x509 -inform DES -in DigiCertHighAssuranceEVRootCA.crt -out DigiCertHighAssuranceEVRootCA.pem -text
    export PIP_CERT=`pwd`/DigiCertHighAssuranceEVRootCA.pem

    要使其重新可用,请将digicerthighasuranceevrootca.crt放在常见的地方,并在~/.bashrc中相应地导出pip-cert。


    为了一次性解决这个问题,您可以验证您有一个pip.conf文件。

    根据文件,您的pip.conf应该在这里:

    On Unix the default configuration file is: $HOME/.config/pip/pip.conf which respects the XDG_CONFIG_HOME environment variable.

    On macOS the configuration file is $HOME/Library/Application Support/pip/pip.conf if directory $HOME/Library/Application Support/pip exists else $HOME/.config/pip/pip.conf

    On Windows the configuration file is %APPDATA%\pip\pip.ini.

    在virtualenv中:

    On Unix and macOS the file is $VIRTUAL_ENV/pip.conf

    On Windows the file is: %VIRTUAL_ENV%\pip.ini

    您的pip.conf应该如下所示:

    1
    2
    [global]
    trusted-host = pypi.python.org

    创建pip.conf文件后,pip install linkchecker安装了linkchecker,没有抱怨。


    您可以通过以下方法来解决CERTIFICATE_VERIFY_FAILED的问题:

    • 使用HTTP而不是HTTPS。
    • 使用--cert CA_BUNDLE变量指定备选CA包。

      例如,您可以从Web浏览器转到失败的URL,并将根证书导入系统。

    • 运行python -c"import ssl; print(ssl.get_default_verify_paths())"检查当前版本(如果存在则验证)。

    • openssl有一对环境(SSL_CERT_DIRSSL_CERT_FILE可以用来指定不同的证书数据库pep-476。
    • 使用--trusted-host 将主机标记为受信任。
    • 在python中,将verify=False用于requests.get(请参见:ssl cert verification)。
    • 使用--proxy 避免证书检查。

    在:tls/ssl wrapper for socket objects-verifying certificates上阅读更多信息。


    对我来说,通过创建文件夹解决了这个问题。pip,文件:pip.ini。在里面C:\Users\\AppData
    oaming\
    例如:

    1
    2
    C:\Users\<username>\AppData
    oaming\pip\pip.ini

    在里面我写道:

    1
    2
    3
    4
    [global]
    trusted-host = pypi.python.org
                   pypi.org
                   files.pythonhosted.org

    我重新启动了python,然后pip永久信任这些站点,并使用它们从下载包。


    我最近遇到这个问题是因为我公司的Web内容过滤器使用它自己的证书颁发机构来过滤SSL流量。在我的例子中,PIP似乎没有使用系统的CA证书,从而产生了您提到的错误。将pip降级到1.2.1版以后会出现自己的一组问题,所以我回到了Python3.4附带的原始版本。

    我的解决方法很简单:使用easy_install。要么它不检查证书(像旧的PIP版本),要么它知道使用系统证书,因为它每次对我都有效,我仍然可以使用PIP卸载安装了易于安装的软件包。

    如果这不起作用,并且您可以访问没有问题的网络或计算机,那么您可以始终设置自己的个人PYPI服务器:如何在不使用镜像的情况下创建本地自己的PYPI存储库索引?

    我几乎做到了这一点,直到我试图用easy_install作为最后的努力。


    您可以尝试使用HTTP而不是HTTPS来绕过SSL错误。当然,这在安全性方面不是最佳的,但是如果您赶时间的话,它应该做到以下几点:

    1
    pip install --index-url=http://pypi.python.org/simple/ linkchecker


    使用的答案

    1
    pip install --trusted-host pypi.python.org <package>

    工作。但是您必须检查是否有重定向或缓存pip正在命中。在使用pip 9.0.1的Windows7上,我必须运行

    1
    2
    3
    4
    5
    pip install \
      --trusted-host pypi.python.org \
      --trusted-host pypi.org \
      --trusted-host files.pythonhosted.org \
      <package>

    您可以在详细标志中找到这些。


    我安装了PIP 1.2.1,安装简单,升级到最新版本的PIP(当时为6.0.7),在我的情况下,它可以安装软件包。

    1
    2
    easy_install pip==1.2.1
    pip install --upgrade pip

    正确设置时间和日期!

    梅比,我回答得有点晚了,

    对我来说,我的日期和时间在覆盆子圆周率上配置错误。结果是,使用https://files.pythonhosted.org/服务器,所有SSL和HTTPS连接都失败。

    更新如下:

    1
    2
        sudo date -s"Wed Aug  23 11:12:00 GMT+1 2018"
        dpkg-reconfigure tzdata


    您有4个选项:

    使用证书作为参数

    1
    $ pip install --cert /path/to/mycertificate.crt linkchecker

    pip.conf中使用证书

    创建此文件:

    1
    2
    3
    $HOME/.pip/pip.conf (Linux)

    %HOME%\pip\pip.ini (Windows)

    并添加这些行:

    1
    2
    [global]
    cert = /path/to/mycertificate.crt

    忽略证书并使用HTTP

    1
    $ pip install --trusted-host pypi.python.org linkchecker

    忽略证书并在pip.conf中使用http

    创建此文件:

    1
    2
    3
    $HOME/.pip/pip.conf (Linux)

    %HOME%\pip\pip.ini (Windows)

    并添加这些行:

    1
    2
    [global]
    trusted-host = pypi.python.org

    来源

    • https://pip.pypa.io/en/latest/user_-guide/配置


    首先,

    1
        pip install --trusted-host pypi.python.org <package name>

    不适合我。我一直在获取证书"验证失败"错误。但是,我在错误消息中注意到它们引用了"pypi.org"站点。所以,我使用这个作为可信主机名,而不是pypi.python.org。这几乎把我带到了那里;装载仍然失败,证书验证失败,但在后来的一点上。找到对失败网站的引用后,我将其作为受信任的主机包含进来。最终对我起作用的是:

    1
        pip install --trusted-host pypi.org --trusted-host files.pythonhosted.org <package name>

    在64位Windows7Enterprise上使用ActivePython2.7.8、ActivePython3.4.1和"stock"python3.4.2尝试pip install ftputil时也遇到了同样的问题。所有尝试均失败,错误与op相同。

    通过降级到pip 1.2.1:easy_install pip==1.2.1(参见https://stackoverflow.com/a/16370731/234235),解决了python 3.4.2的问题。同样的修复也适用于ActivePython 2.7.8。

    2013年3月报告的bug仍然存在:https://github.com/pypa/pip/issues/829。


    在我使用--verbose选项查看它想要访问files.pythonhosted.org而不是pypi.python.org之前,此页面上的任何内容都对我无效:

    1
    pip install --trusted-host files.pythonhosted.org <package_name>

    因此,通过--verbose选项检查它实际失败的URL。


    您可以尝试忽略"https":

    1
    pip install --index-url=http://pypi.python.org/simple/ --trusted-host pypi.python.org  [your package..]


    我通过删除我的PIP并安装旧版本的PIP解决了这个问题:https://pypi.python.org/pypi/pip/1.2.1


    对我来说,这是因为以前我运行的脚本设置了代理(到fiddler),重新打开控制台或重新启动修复了问题。


    最近,我在使用Visual Studio 2015的python 3.6中遇到了同样的问题。花了2天时间后,我得到了解决方案,它对我来说工作得很好。

    尝试使用pip或从Visual Studio安装numpy时出现以下错误收集麻木无法获取url https://pypi.python.org/simple/numpy/:确认SSL证书时出现问题:[ssl:certificate_verify_failed]certificate verify failed(_ssl.c:748)-跳过找不到满足要求numpy的版本(来自版本:)找不到与numpy匹配的分发

    决议:

    对于Windows操作系统

  • 打开->"%appdata%"创建"pip"文件夹(如果不存在)。
  • 在pip文件夹中创建"pip.ini"文件。
  • 编辑文件并写入[全球]可信主机=pypi.python.org保存并关闭文件。现在安装使用PIP/Visual Studio可以很好地工作。

  • 一种解决方案(对于Windows)是在%AppData%\pip\文件夹上创建名为pip.ini的文件(如果该文件夹不存在,则创建该文件夹),并插入以下详细信息:

    1
    2
    3
    [global]
    cert = C:/certs/python_root.pem
    proxy = http://my_user@my_company.com:my_password@proxy_ip:proxy_port

    …然后我们可以执行安装指令:

    1
    pip3 install PyQt5

    另一个选项是使用代理和证书的参数安装包…

    1
    2
    $ pip3 install --proxy http://my_user@my_company.com:my_password@proxy_ip:proxy_port \
       --cert C:/certs/python_root.pem PyQt5

    要将证书*.cer文件转换为所需的*.pem格式,请执行以下指令:

    1
    $ openssl x509 -inform der -in python_root.cer -out python_root.pem

    希望这能帮助别人!


    沃斯坦的回答帮助了我。

    我在电脑上的任何地方都找不到pip.ini文件。下面也找不到。

  • 已转到appdata文件夹。您可以通过打开命令提示符并键入echo%appdata%来获取appdata文件夹。
  • AppData location using command prompt

    或者只需在Windows资源管理器中键入%appdata%。

    AppData location in windows explorer

  • 在该appdata文件夹中创建一个名为pip的文件夹。

  • 在刚才创建的pip文件夹中,创建一个名为pip.ini的简单文本文件

  • 使用您选择的简单编辑器,通过该文件中的以下配置设置。

  • PIP.IN文件:

    1
    2
    3
    4
    5
    [list]
    format=columns

    [global]
    trusted-host = pypi.python.org pypi.org

    你现在该走了。


    如果您已经使用make手动安装了python,则必须遵循以下答案:https://stackoverflow.com/a/42798679/6403406才能使其正常工作。


    在我的例子中,我运行的是最小阿尔卑斯Docker映像中的python。它缺少根CA证书。修复:

    apk update && apk add ca-certificates


    如果系统中缺少某些证书,则可能会出现此问题。例如,在OpenSUSE上,安装CA证书Mozilla


    到目前为止,当pip升级到10时,他们已经将路径从pypi.python.org改为files.pythonhosted.org。请将命令更新为pip--trusted host files.pythonhosted.org install python_包


    对我来说,所有建议的方法都不起作用——使用cert、http和可信主机。

    在我的例子中,切换到不同版本的包是有效的(本例中是paho mqtt 1.3.1,而不是paho mqtt 1.3.0)。

    看来问题是特定于该包版本的。