【问题标题】:Pip upgrade cannot install packagespip升级无法安装包
【发布时间】:2020-10-09 05:20:25
【问题描述】:

我已经跳了一段时间来解决这个问题,但我似乎无法让它工作。我有一个 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)'),))

很简单,我有一个certificate 来处理思科的保护伞。然后我可以轻松安装所有软件包。但是,为了能够安装最新的软件包,我需要升级 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 文件,其中包含受信任主机和认证的全局标签。同样的错误仍然存​​在。

点安装

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

做什么

我现在有点不知所措,在容器中安装证书允许我在升级到pip 20.2.3 后安装带有pip 9.0.1(系统默认)的包。我无法让它与任何软件包一起使用。我已经尝试了多个 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

从最后一行可以看出他们在协议上不一致,通信失败

【问题讨论】:

  • 你能提供一个最小的复制库吗?
  • @concision,似乎做不到。我已经尝试过,并在我的私人 PC 上对其进行了测试,没有任何问题。在我看来,这似乎是一些网络问题。但是 IT 部门说不是 :) 所以这就是为什么我想清空选项,如果有人有想法的话。
  • 您使用的基本映像是什么(即FROM 命令中的那个)?也许尝试使用基本映像的 Linux 包管理器安装 ca-certificates Linux 包?
  • @concision 这是我的FROM "nvidia/cuda:10.0-cudnn7-runtime-ubuntu18.04",所以它一定是正确的吗?据我所知,安装它的步骤在这篇文章中完成。或者您有安装证书的特定方法吗?
  • 从最后一行可以看出,他们不同意协议,通信失败 - 不是真的。查看github.com/curl/curl/issues/2749 这不是一个错误,而只是一个信息。似乎服务器不接受提供的 h2 和 http/1.1。在这种情况下,最终可能已经协商了 http/1.0 甚至 http/0.9。

标签: python docker pip ssl-certificate


【解决方案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 &lt;ssh key&gt;。

另外,请确保

  • 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/....
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    对于 docker build 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,否则无需添加该证书。 “在我的私人电脑上测试它没有任何问题”告诉你它是环保的。

    您始终可以运行docker run -it nvidia/cuda:10.0-cudnn7-runtime-ubuntu18.04 以获取容器上的shell,然后开始手动运行Dockerfile 中的命令。当事情破裂时,会回到 linux 故障排除。毕竟你是在一个类似 ubuntu 的环境中

    【讨论】:

    • 亲爱的蒂莫西,你是对的,但自从添加证书后,这最初并不为人所知,实际上有所帮助。但是,一旦我升级了 pip,它就停止了工作,尽管有证书。
    【解决方案4】:

    这似乎是与您的证书(旧的或无效的)或您的(可能未更新的)pip 版本有关的问题。 下面有一个关于针对相同(或类似)问题的对话的链接。 我希望,我可以帮助...

    https://community.onion.io/topic/4014/problem-installing-packages-through-pip3-omega2/3

    【讨论】:

    • 亲爱的斯文,如问题中所述。证书正在运行,但是当我升级 pip 时它失败了。我在链接中没有看到与我所说的不同的点?
    猜你喜欢
    • 2019-06-17
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-26
    • 2018-12-29
    • 2017-05-01
    相关资源
    最近更新 更多