pip始终无法通过ssl验证

pip always fails ssl verification

即使我执行pip install dedupepip install --trusted-host pypi.python.org dedupe,Pip也总是失败

无论如何,输出总是相同的:

Collecting dedupe

Retrying (Retry(total=4, connect=None, read=None,
redirect=None, status=None)) after connection broken by
'SSLError(SSLError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate
verify failed (_ssl.c:777)'),)': /simple/dedupe/
Retrying...

skipping

Could not find a version that satisfies the requirement dedupe (from versions: ) No matching distribution found for dedupe

所以我卸载了anaconda并重新安装了它。 一样。

你认为问题是我的_ssl.c文件(我不知道它在哪里)必须是腐败的还是什么? 如果我告诉它绕过ssl验证,为什么pip需要引用呢?


它可能与2018年PyPI域的变化有关。
请确保您的防火墙/代理允许访问/来自:

  • pypi.org
  • files.pythonhosted.org
  • 所以你可以尝试一下这样的事情:

    $ python -m pip install --trusted-host files.pythonhosted.org --trusted-host pypi.org --trusted-host pypi.python.org [--proxy ...] [--user]

    Ok.

    有关--user选项说明,请参阅$ pip help install(如果在virtualenv中,则省略)。
    --trusted-host选项实际上并不绕过SSL / TLS,但允许在(并且仅当)它没有有效(或任何)HTTPS时将主机标记为受信任。使用PiPY并不重要,因为pypi.org(以前称为pypi.python.org)确实使用HTTPS,并且前面有CDN,无论连接pip客户端选项如何,它总是强制执行TLSv1.2握手要求。但是如果你有自己的pypi.org本地镜像,只有HTTP访问权限,然后--trusted-host可能很方便。哦,如果你是代理的后面,请同时确保也指定:--proxy [user:passwd@]proxyserver:port
    一些企业代理甚至可能会动态替换HTTPS连接的证书。如果您的系统时钟不同步,它也可能会破坏SSL验证过程。

    如果防火墙/代理/时钟不是问题,那么请检查pip的SSL握手中使用的SSL证书。事实上,你可以获得一个当前的cacert.pem(来自curl的Mozilla的CA捆绑包)并使用pip选项--cert进行尝试:

    $ pip --cert ~/cacert.pem install --user
    where --cert argument is system path to your alternate CA bundle in PEM format. (regarding the --user option, please see below).
    Or, it's possible to create a custom config ~/.pip/pip.conf and point the option at a valid system cert (or your cacert.pem) as a workaround, for example:
    [global]
    cert = /etc/pki/tls/external-roots/ca_bundle.pem
    (or another pem file)

    Ok.

    甚至可以用您可靠的CA捆绑包手动替换pip中的原始cacert.pem(例如,如果您的点数非常老)。较旧的pip版本知道在pip / _vendor / requests / cacert.pem和系统存储(如/etc/ssl/certs/ca-certificates.crt/etc/pki/tls/certs/ca-bundle.crt)之间回退,以防出现证书问题,但在最近的点子中它不再是这种情况,因为它似乎完全依赖于PIP / _vendor / CERTIFI / cacert.pem

    基本上,pip包使用requests,它使用urllib3,其中包括验证SSL证书;并且所有这些都在pip内运送(出售),以及提供TLS验证所需的当前CA捆绑包(cacert.pem文件)的certifi包(也包括在pip 9.0.2中)。请求本身在内部使用urllib3和certifi,在9.0.2之前,pip使用了来自请求或系统的cacert.pem。这一切意味着实际更新pip可能有助于修复CERTIFICATE_VERIFY_FAILED错误,特别是如果很久以前部署了OS和pip:

  • OP使用anaconda,所以他们可以尝试:
    $ conda update pip - 因为如果conda和pip在同一环境中一起使用,则会出现问题。如果没有可用的pip版本更新,他们可以尝试:
    $ conda config --add channels conda-forge; conda update pip
    或者,可以单独使用conda来直接安装/管理python包:它是一个完全独立于pip的工具,但在包和venv管理方面提供了类似的功能。它的包不是来自PyPI,而是来自anaconda自己的存储库。
    问题是,如果你混合使用并在pip之后运行conda,前者可以覆盖并破坏通过pip安装的包(及其依赖项),并使其全部无法使用。所以建议只使用其中一个,或者,如果必须,只使用conda之后的pip(pip之后没有conda),并且仅在隔离的conda环境中使用。

  • 在没有conda的普通Linux Python安装上:
    如果您使用的是OS分发版提供的pip版本,则使用供应商提供的升级进行系统范围的pip更新:
    $ sudo apt-get install python-pip或:$ sudo yum install python27-pip
    由于发行版通常落后于PyPI,因此可能无法获得一些更新。在这种情况下,可以在用户级别(在$ HOME目录中)或者在virtualenv内升级pip,例如:
    <5233>
    (如果在virtualenv中省略--user)
    --user开关只会为当前用户(在你家?/ .local / lib /中)而不是整个操作系统升级pip,这是避免干扰系统python包的一个好习惯。它默认在最近的Ubuntu / Fedora版本中分发的pip中启用。如果不使用此选项并且碰巧覆盖操作系统级别的系统点,请注意如何解决ImportError。
    或者(也在用户级别)您可以尝试:
    $ curl -LO https://bootstrap.pypa.io/get-pip.py && python get-pip.py --user
    PyPA脚本包含一个从pip._vendor.certifi中提取.pem SSL包的包装器。

  • 否则,如果仍然不行,请尝试使用-vvv选项运行pip以向输出添加详细程度,并检查现在是否存在由tlsv1警报协议版本引起的另一个SSLError

    好。


    上面的错误或类似错误是由于虚拟机(VM)没有时间同步,我的客户Ubuntu VM过去几天。

    我运行此命令让VM获取正确的网络时间:

    1
    sudo timedatectl set-ntp on

    这使得Ubuntu客户操作系统获得了网络时间。 (您可能需要提供网络时间源...我使用过这篇文章:数字海洋 - 如何在Ubuntu上设置时间)

    检查时间是否正确:

    1
    timedatectl

    重新运行失败的pip命令。