Pip升级无法安装软件包。

9

我已经跳了一段时间来解决这个问题,但似乎无法使它正常工作。我有一个Docker容器,在其中设置了一个用于机器学习的nvidia图像。我安装了所有Python依赖项。然后我开始进行pip包安装。我遇到了第一个错误:

requests.exceptions.SSLError: HTTPSConnectionPool(host='files.pythonhosted.org', port=443): Max retries exceeded with url: /packages/5e/c4/6c4fe722df5343c33226f0b4e0bb042e4dc13483228b4718baf286f86d87/certifi-2020.6.20-py2.py3-none-any.whl (Caused by SSLError(SSLError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:852)'),))

很简单,我有一个用于处理 Cisco umbrella 的证书。然后我可以轻松地安装所有软件包。但是,为了能够安装最新的软件包,我需要升级 pip,并且升级也正常工作。但是当 pip 升级到20.2.3时,我突然又遇到了错误:

Could not fetch URL https://pypi.org/simple/pip/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/pip/ (Caused by SSLError(SSLError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:852)'),)) - skipping

我进行了谷歌搜索并尝试了我偶然发现的建议:

时间

我发现系统时间不正确-它适用于最初的pip版本,这很奇怪。但更改时间并没有帮助解决问题。

配置文件

我添加了一个包含全局标签的pip.conf文件,用于受信任的主机和认证。 仍然存在相同的错误。

pip安装

我尝试使用不同的受信任主机标志以及证书标志,这些应该已经在conf文件中指定-如果我理解得正确的话。 然而,两种方法都没有起作用。

该怎么办

我有点束手无策,现在,在容器中安装证书允许我使用pip 9.0.1(系统默认)安装软件包后,升级到pip 20.2.3。 我无法让它与任何软件包一起工作。 我尝试了多个pip版本-但是一旦我升级,我会失去证书,并尝试重新安装它。

ADD Cisco_Umbrella_Root_CA.cer /usr/local/share/ca-certificates/Cisco_Umbrella_Root_CA.crt
RUN chmod 644 /usr/local/share/ca-certificates/Cisco_Umbrella_Root_CA.crt
RUN update-ca-certificates --fresh

有人知道这是怎么发生的吗?

更新

Curl

 RUN curl -v -k -H"Host; files.pythonhosted.org" https://files.pythonhosted.org/packages/8a/fd/bbbc569f98f47813c50a116b539d97b3b17a86ac7a309f83b2022d26caf2/Pillow-6.2.2-cp36-cp36m-manylinux1_x86_64.whl
  ---> Running in ac095828b9ec
   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                  Dload  Upload   Total   Spent    Left  Speed
   0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0*   Trying ::ffff:146.112.56.166...
 * TCP_NODELAY set
 * Connected to files.pythonhosted.org (::ffff:146.112.56.166) port 443 (#0)
 * ALPN, offering h2
 * ALPN, offering http/1.1
 * successfully set certificate verify locations:
 *   CAfile: /etc/ssl/certs/ca-certificates.crt
   CApath: /etc/ssl/certs
 } [5 bytes data]
 * TLSv1.3 (OUT), TLS handshake, Client hello (1):
 } [512 bytes data]
 * TLSv1.3 (IN), TLS handshake, Server hello (2):
 { [85 bytes data]
 * TLSv1.2 (IN), TLS handshake, Certificate (11):
 { [3177 bytes data]
 * TLSv1.2 (IN), TLS handshake, Server finished (14):
 { [4 bytes data]
 * TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
 } [262 bytes data]
 * TLSv1.2 (OUT), TLS change cipher, Client hello (1):
 } [1 bytes data]
 * TLSv1.2 (OUT), TLS handshake, Finished (20):
 } [16 bytes data]
 * TLSv1.2 (IN), TLS handshake, Finished (20):
 { [16 bytes data]
 * SSL connection using TLSv1.2 / AES256-GCM-SHA384
 * ALPN, server did not agree to a protocol

从最后一行可以看出,他们在协议上存在分歧,导致通信失败。


你能提供一个最小化的复现仓库吗? - concision
@concision 这是我的 FROM "nvidia/cuda:10.0-cudnn7-runtime-ubuntu18.04",所以必须使用 apt-get 对吧?据我所知,安装步骤在这篇文章中已经完成了。或者你有特定的证书安装方法吗? - JTIM
由于 pypi.org 的 SSL 验证失败,请通过在图像内运行以下命令来检查遇到问题的网络的 SSL 证书:openssl s_client -showcerts -servername pypi.org -connect pypi.org:443 2>/dev/null | openssl x509 -noout -text。组织颁发者应为 O = DigiCert Inc,并带有几个其他对 digicert 的引用。如果您看到其他情况,则可能是潜在问题。 - concision
非常抱歉-看起来我读错了,因为标签名称相似。请尝试调用以下命令:apt-get -y update && apt-get install -y curl && curl https://pypi.org/simple/pip/。如果整个容器存在SSL问题,则curl可能会输出更详细的输出,可以帮助缩小问题范围。如果 curl 成功,则很可能只是 pip 的问题。我注意到在 pip 的安装页面上有一个关于使用由操作系统管理的Python安装的警告,https://pip.pypa.io/en/stable/installing/。这可能具有一定的重要性? - concision
2
从最后一行可以看出,他们在协议上并不一致,通信失败了 - 实际上并非如此。查看 https://github.com/curl/curl/issues/2749,这不是一个错误,而只是一条信息。似乎服务器没有接受提供的h2和http/1.1。在这种情况下,最终可能会协商使用http/1.0甚至http/0.9。 - Piotr Dobrogost
显示剩余5条评论
4个回答

1
答案中提到的步骤和我的问题肯定是应该尝试的。如果有人无法使其工作,就像我一样,在这种特定情况下,是IT组织设置了要代理到umbrella的信息,并且它不支持ssl扫描/解密。

1

不久前我遇到了类似的问题。对我来说,解决方案是在一个Docker层中添加证书并安装依赖项。

我不知道你的Dockerfile具体是什么样子的,但我会尝试像这样做:

ADD Cisco_Umbrella_Root_CA.cer /usr/local/share/ca-certificates/Cisco_Umbrella_Root_CA.crt
RUN chmod 644 /usr/local/share/ca-certificates/Cisco_Umbrella_Root_CA.crt && \
    update-ca-certificates --fresh && \
    pip install --upgrade pip setuptools && \
    pip install -r production.txt && \
    rm /usr/local/share/ca-certificates/Cisco_Umbrella_Root_CA.crt  # for extra safety

作为参考,我所做的事情:

RUN mkdir -p -m 0600 ~/.ssh/ && \
    ssh-keyscan <my host> >> ~/.ssh/known_hosts && \
    eval `ssh-agent -s` && \
    ssh-add <ssh key> && \
    echo "Installing packages from pip. It might take a few minutes..." && \
    pip install --upgrade pip setuptools && \
    pip install -r production.txt && \
    rm <ssh key>

在另一层中,ssh密钥已经被chmod 400 <ssh key>

此外,请确保执行以下操作:

  • apt update
  • apt install -y ca-certificates 或者
  • apt upgrade

非常感谢您的输入,但是我仍然遇到相同的问题。我已经完成了以下操作-> apt-get安装并创建了镜像,并在我的baselayer中升级了pip包。然后我在secondlayer中使用了您第一个建议的修改版本来安装我的要求文件,尽管仍然发出相同的https错误WARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:852)'),)': /package/.... - JTIM

0

亲爱的Sven,如问题所述。证书是有效的,但当我升级pip时它失败了。我看不出链接中有什么不同于我所述的内容? - JTIM

0

对于 Docker 构建 Docker 的问题,您确实需要展示大部分的 Dockerfile。

上面的细节似乎表明 Docker 文件将会有:

FROM nvidia/cuda:10.0-cudnn7-runtime-ubuntu18.04
RUN set -ex \
  && apt update \
  && apt upgrade \
  && apt install -y curl python-pip
  && pip install --upgrade pip setuptools

没有 Dockerfile,就没有起点,唯一能给出的答案是“你似乎有网络问题”。当我尝试上述方法时,一切都正常工作。
在容器内使用 Curl 时,我收到的 SSL 证书是:
* Server certificate:
*  subject: C=US; ST=California; L=San Francisco; O=Fastly, Inc; CN=r.ssl.fastly.net
*  start date: Jul 20 18:19:08 2020 GMT
*  expire date: Apr 28 19:20:25 2021 GMT
*  issuer: C=BE; O=GlobalSign nv-sa; CN=GlobalSign CloudSSL CA - SHA256 - G3

该证书是大多数系统应具备的基本证书。您可以使用openssl解释结果。

由于您正在添加“Cisco_Umbrella_Root_CA.cer”,因此您正在通过公司代理进行代理。否则,无需添加该证书,请参见Cisco Umbrella根证书。 "在我的私人PC上测试过没有任何问题"告诉您它是环境问题。

您始终可以运行docker run -it nvidia/cuda:10.0-cudnn7-runtime-ubuntu18.04以获取容器中的Shell ,然后手动开始运行Dockerfile中的命令。当事情出现故障时回退到Linux故障排除。毕竟,您处于类似Ubuntu的环境中。


亲爱的蒂莫西,你是对的,但最初并不知道这一点,因为添加证书实际上有所帮助。但是,一旦我升级了pip,尽管有证书,它就停止工作了。 - JTIM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接