【发布时间】: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-certificatesLinux 包? -
@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