点升级无法安装软件包

时间:2020-10-09 05:20:25

标签: python docker pip ssl-certificate

我已经跳了一段时间解决了这个问题,我似乎无法使它正常工作。我有一个泊坞窗容器,在其中设置了用于机器学习的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)'),))

很简单,我有一个certificate来处理Cisco的保护伞。然后,我可以轻松便捷地安装所有软件包。但是,为了能够安装最新的软件包,我需要升级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

然后我在Google周围搜索并尝试了偶然发现的建议:

定时

我发现系统时间错了-它适用于最初的pip版本,这很奇怪。但是,更改时间并不能解决问题。

conf

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

点安装

我尝试使用其他受信任的主机标志以及cert标志,如果我正确理解的话,应该已经从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

任何人都知道这种情况如何发生吗?

更新

卷曲

 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

从最后一行可以看出,他们不同意协议,并且通信失败

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

答案和我的问题中建议的步骤绝对是应该尝试的步骤。如果有人像我一样无法使其正常工作,那么在此特定情况下,是由IT组织将信息设置为代理,并且不支持ssl扫描/解密。

答案 2 :(得分: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 Root Certificate,否则无需添加该证书。 “在我的私人PC上进行了无任何问题的测试”告诉您这是环境。

您始终可以运行docker run -it nvidia/cuda:10.0-cudnn7-runtime-ubuntu18.04来在容器上获取​​外壳,然后开始手动运行Dockerfile中的命令。当事情破裂时,请回到linux故障排除。毕竟,您处于类似Ubuntu的环境中