pip始终无法通过ssl验证

ctzwtxfj  于 2023-04-30  发布在  其他
关注(0)|答案(6)|浏览(188)

即使我使用pip install dedupepip install --trusted-host pypi.python.org dedupe,Pip也总是无法通过ssl
无论如何,输出总是相同的:
收集重复数据消除
在连接被“SSLError(SSLError(1,'[SSL:CERTIFICATE_VERIFY_FAILED]证书验证失败(_ssl.c:777)'),)':/简单/重复数据消除/
正在重试...
跳跃
找不到满足重复数据消除要求的版本(来自以下版本:)未找到与重复数据消除匹配的分发
所以我卸载了anaconda并重新安装了它。一样的
你认为问题是我的_ssl。c文件(我不知道它在哪里)一定是损坏了什么的?如果我告诉pip无论如何都要绕过ssl验证,为什么pip需要引用它呢?

lf3rwulv

lf3rwulv1#

它可能与PyPI结构域的2018 change有关。
请确保您的防火墙/代理允许访问/访问:

  • pypi.org
    • www.example.com 我们

所以你可以给予一下这样的东西:
$ python -m pip install --trusted-host www.example.com --trusted-host www.example.com --trusted-host www.example.com [--proxy ...] [--user] <packagename>
有关--user选项的说明,请参阅$ pip help install(如果在virtualenv中,请省略)。
--trusted-host选项实际上并没有绕过SSL/TLS,但允许在(且仅在)主机没有有效(或任何)HTTPS时将其标记为受信任。PiPY应该没什么关系,因为www. example www.example.com (以前的 www.example.com )* 确实 * 使用HTTPS,并且在它前面有CDN,它总是强制执行TLSv 1。2握手要求,而不管连接的PIP客户端选项。但是如果你有自己的本地镜像网站www. example www.example.com 。哦,如果您使用代理,请确保还指定:--proxy [user:passwd@]proxyserver:port
一些企业代理甚至可能会在运行中replace HTTPS连接的证书。如果您的系统时钟不同步,也可能会破坏SSL验证过程。
如果防火墙/代理/时钟没有问题,那么检查pip的SSL握手中使用的SSL证书。实际上,您可以获取当前的cacert.pem(来自curl的Mozilla CA捆绑包),并使用pip选项--cert进行尝试:
$ pip --cert ~/cacert.pem install --user <packagename>
其中,--cert参数是PEM格式的备用CA捆绑包的系统路径。(关于--user选项,请参见下文)。
或者,也可以创建一个自定义配置~/。然后将选项指向有效的系统证书(或您的cacert)。pem)作为解决方法,例如:

  • [全局]*
  • cert = /etc/pki/tls/external-roots/ca_bundle。pem*

(or另一个pem文件)
甚至可以手动替换原始cacert。pem在pip中与您可信赖的CA捆绑包一起找到(例如,如果您的pip非常旧)。较早的pip版本知道在pip/_vendor/requests/cacert之间回退。pem和系统存储,如/etc/ssl/certs/ca-certificates.crt/etc/pki/tls/certs/ca-bundle.crt,但在最近的pip中,情况不再如此,因为它似乎只依赖于pip/_vendor/certifici/cacert。PEM
基本上,pip包使用requestsurllib3,除其他外,验证SSL证书;并且所有这些都在PIP内与X1 M14 N1 X包(从PIP 9开始也包括在内)一起被运送(出售)。0.2),提供当前CA捆绑包(cacert.pem文件)进行TLS验证。requests本身在内部使用urllib 3和certifici,在9之前。0.2,pip使用cacert。请求或系统的PEM。这意味着实际更新pip可能有助于修复CERTIFICATE_VERIFY_FAILED错误,特别是如果操作系统和pip是很久以前部署的:

  • OP使用了anaconda,所以他们可以尝试:

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

  • 在没有conda的正常Linux Python安装中:

如果您使用的是OS发行版提供的pip版本,则使用供应商提供的升级来进行系统范围的pip更新:
$ sudo apt-get install python-pip或:$ sudo yum install python27-pip
一些更新可能不容易获得,因为发行版通常落后于PyPI。在这种情况下,可以在用户级别升级pip(在 $HOME 目录中),或者在virtualenv中升级,比如:
$ python -m pip install --user --trusted-host files.pythonhosted.org --trusted-host pypi.org --trusted-host pypi.python.org --upgrade pip
(omit --user(如果在虚拟环境中)
--user交换机将只为当前用户升级pip(在您的家中~/。local/lib/)而不是整个操作系统,这是避免干扰系统python包的好做法。它在最近的Ubuntu/Fedora版本中分发的pip中默认启用。如果您不使用此选项并且碰巧覆盖了操作系统级的系统pip,请注意如何解决ImportError
或者(也是在用户级别),您可以尝试:
$ curl -LO https://bootstrap.pypa.io/get-pip.py && python get-pip.py --user
PyPA script包含一个提取。pip中的pem SSL包。_vendor.certifi.
否则,如果仍然不成功,请尝试运行pip with -vvv选项,以向输出添加详细信息,并检查现在是否存在由tlsv1 alert protocol version引起的另一个SSLError

91zkwejq

91zkwejq2#

这对我来说很有用,试试这个:
pip install --trusted-host=pypi.org --trusted-host=files.pythonhosted.org --user {name of whatever I'm installing}

ccgok5k5

ccgok5k53#

我遇到了同样的问题,因为我安装了Zscaler(云安全软件),导致:

  • Python包的URL主机被阻止
  • 无效的SSL证书警告弹出
  • SSL检查证书不受信任

正如其他人提到的,下面将修复单个包安装。不需要pypi.python.org,因为它已被pypi.org替换。

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

我通过创建pip.ini文件(Unix中的pip.conf)并添加以下内容永久修复了该问题:

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

请参阅pip configuration files了解如何找到pip.ini,或者如果需要创建一个pip.ini,请将其放置在何处。

kx5bkwkv

kx5bkwkv4#

我的方法是@Alex C的答案的简化:

python -m pip install --trusted-host pypi.python.org --trusted-host files.pythonhosted.org --trusted-host pypi.org --upgrade pip
rdlzhqv9

rdlzhqv95#

上面的错误或类似的错误是由虚拟机(VM)没有时间同步引起的,我的客户机Ubuntu VM是过去几天的。
我运行了这个commit来让VM获取正确的网络时间:

sudo timedatectl set-ntp on

这使得Ubuntu客户机操作系统获得网络时间。(您可能需要提供网络时间源。我用了这篇文章:Digital Ocean - How to set time on Ubuntu
检查时间是否正确:

timedatectl

重新运行失败的pip命令。

mbjcgjjk

mbjcgjjk6#

macOS用户:

问题是Python 3。6+不再使用macOS的OpenSSL,而是使用自己的捆绑OpenSSL,无法访问macOS的根证书。这是永久的解决办法。
首先运行以下命令:

# Update pip
pip3 --trusted-host files.pythonhosted.org --trusted-host pypi.org install --upgrade pip
# Install certifi
pip3 --trusted-host files.pythonhosted.org --trusted-host pypi.org install certifi

将其添加到您的~/.bash_profile(或~/.zprofile或您的shell使用的任何启动文件),以便您的环境知道在哪里可以找到证书CA包:

if [ -x "$(command -v python3)" ]; then
    # Side note: 'python3 -m certifi' is also equivalent to
    # 'python3 -c "import certifi; print(certifi.where())"'                                                                                             
    export SSL_CERT_FILE="$(python3 -m certifi)"
    export REQUESTS_CA_BUNDLE="${SSL_CERT_FILE}"
fi

重新启动shell,或重新创建shell启动文件:

. ~/.bash_profile

pip3(或任何发出HTTPS请求的Python脚本)现在应该可以工作,而无需使用长pip3命令或危险地禁用证书验证。
旁注:您可能注意到我没有包括 www.example.com 。这是因为它自2018年以来一直被弃用。我已经有一年多没有把它包括进去了,我从来没有遇到过问题。据我所知,它现在没有使用。

相关问题