当前位置: 首页 > 知识库问答 >
问题:

无法在Ubuntu中使用pip安装Python包Linux: InsecurePlatformWarning, SSLError, tlsv1警报协议版本

姜俊逸
2023-03-14

以前我使用pip安装包,但现在我试图使用pip安装Python库,得到一个SSL错误:

 /home/teleduce/.virtualenvs/teleduce_handler/local/lib/python2.7/site-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py:318: SNIMissingWarning: An HTTPS request has been made, but the SNI (Subject Name Indication) extension to TLS is not available on this platform. This may cause the server to present an incorrect TLS certificate, which can cause validation failures. You can upgrade to a newer version of Python to solve this. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#snimissingwarning.
  SNIMissingWarning
 /home/teleduce/.virtualenvs/teleduce_handler/local/lib/python2.7/site-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py:122: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. You can upgrade to a newer version of Python to solve this. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
  InsecurePlatformWarning
  Could not fetch URL https://pypi.python.org/simple/xlwt/: There was a problem confirming the ssl certificate: [Errno 1] _ssl.c:504: error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version - skipping

OpenSSL和TLS版本

OpenSSL 1.0.1 14 Mar 2012
SSLv3
TLSv1.2

Pip版本

pip 8.1.2 from /home/teleduce/.virtualenvs/project_name/local/lib/python2.7/site-packages (python 2.7)

操作系统信息

Ubuntu 12.04.4 LTS (GNU/Linux 3.8.0-44-generic x86_64)

我试过了

pip install --upgrade pip
curl https://bootstrap.pypa.io/get-pip.py | python

但这对我不起作用。收到的错误消息是

SSL例程:SSL23_GET_SERVER_HELLO: tlsv1警报协议版本

如何修复此错误?

共有1个答案

宋明亮
2023-03-14

发生SSLError是因为系统OpenSSL库版本(编译时链接到Python的版本)低于1.0。1安装Python或当前Python版本低于2.7的日期。9/3.4,因为它们都不支持TLS 1.2协议版本,Python包索引(PyPI)现在需要从pip进行连接。

如果不进行完整的操作系统升级,发行版通常无法轻松升级旧的openssl和系统Python,这并不总是可取的。您可以从最近的来源编译自己的非系统OpenSSL,然后尝试编译一个独立的非系统Python,将其与您刚刚编译的OpenSSL连接起来,但有时由于各种限制,这种方法也是不可行的。

流行的建议,如pip安装请求[secure]或urllib3[secure],通常无法帮助修复pip,因为pip本身受到影响,无法连接到PyPI来安装任何东西。我们无法要求pip连接到PyPI以修复pip无法连接到PyPI的问题。:)要在不升级Python的情况下修复它,我们需要手动安装相关软件包,解决依赖关系:

  • PyOpenSSL密码学(其manylinux1轮船较新的openssl库);
  • 他们的依赖关系:asn1Cryptocffienum34idnaipplacepycparser
  • 任何pip10版本,因为旧的pip版本并没有真正使用密码学-只有标准库的ssl模块(如果您的版本已经是10或以上,则不需要新的pip版本,任何pip v10会做)

在古老的Ubuntu上使用旧的不工作pip和过时的系统openssl版本进行测试。

通过您选择的Web浏览器从Python打包索引(pypi.org)下载以下软件包-为您的操作系统/平台选择最近的manylinux1轮子(. whl):

pip、asn1crypto、enum34、idna、six、ipaddress、pyOpenSSL、cffi、加密控制盘;还有pycparser(一个非轮子,它将是tar.gz)

cp27-代表Python 2.7,cp36-代表Python 3.6;
mu-类型manylinux轮子是一个常见的选择,因为它们适用于以UCS-4(UTF-32)格式存储Unicode数据的Python-以下是如何检查它:
$python-c"导入sys;打印('UCS4/UTF-32: mu-manylinux1'如果sys.maxunicode

Python3注意:cp34-abi3-manylinux1cryptography的轮子可以与任何Python版本一起使用

基本上,控制盘是具有特殊格式文件名和。whl扩展,包含可重新定位的Python包。该包可以是纯python,但也可以有用于python绑定的预编译C库,因此可以安装它,而无需具有某些系统依赖项,如gcc、python dev和其他C头/lib,这通常是classic所需的。焦油gz格式包。这还允许使用捆绑在每个控制盘中的程序的精确版本。PEP-513中采用了manylinux1_u{x86_64,i686}wheel平台标记,它将在许多linux系统上工作,包括常用的桌面和服务器发行版。期待未来的manylinux2标签!

只需创建一个新目录,例如:
$mkdir~/wheels_dir
并将所有下载的包复制(或移动)到该目录。

没有其他文件(除了下载的轮子)和没有子目录那里请!

如果当前的pip版本低于8.1,则必须先安装较新的pip版本,然后才能继续使用所有其他软件包:
$pip install--user--no index~/wheels\u dir/pip-19.0。1-py2。没有。whl
它将升级pip以处理新的Multilux1控制盘格式,并帮助避免“此平台上不支持控制盘”错误。

要在用户主级安装所有软件包,请执行以下操作:
$pip install--user--no index~/wheels\u dir/*
$pip3

如果在新的或现有的virtualenv中安装,请省略--user选项:

$ source bin/activate
$ pip install --no-index ~/wheels_dir/*

Pip将自动解决正确的安装顺序和依赖关系。(如果需要,也可以为此创建requirements.txt)

注意:除非您安装在Python virtualenv或venv中,否则强烈建议始终对pip使用--user标志。然后在~/中的home目录下部署python包。local/lib/事实上,在流行发行版(如Ubuntu、Debian、Fedora等)的最新版本中,python3-pippython-pip软件包提供的发行版补丁pip版本中,此选项默认情况下始终处于启用状态。请尽量避免使用sudo-pip,因为将pip与根访问一起使用会干扰OS package manager子系统(apt、yum等),并且可能会影响依赖于发行版提供的系统python的基本OS组件。

运行$pip freeze(或Python 3中的pip3 freeze)命令检查结果,并确保已为Python环境安装所有软件包。

恭喜!现在,您的pip应该与PyPI一起工作,您可以尝试从在线PyPI回购中查找类似于pip search colama的内容。

通过直接查询已安装的pyOpenSSLlib:
$python-m OpenSSL,可以查看系统SSL/TLS设置的详细摘要。调试(ModuleNotFoundError表示未安装pyOpenSSL包)

密码学的链接OpenSSL共享库与您的系统Python的openssl版本没有任何冲突。现在可能是一个很好的机会,通过安装最新的python认证包,为将来更新根SSL证书集合

pip的早期版本(10之前)只使用标准库的ssl模块(这是一个Python API到系统OpenSSL库),没有任何可能的回退到其他库,如密码学。自版本10以来,pip现在可以将pyOpenSSL与密码学一起使用,如果环境中存在的话。

密码学包的manylinux1轮包括最近的OpenSSL库,该库支持所有高达v1.3的TLS协议,无论您的平台上有什么(PyPI期望pip支持TLSv1.2)。这就是为什么这个轮子重2.1 Mb--归档提供了一个共享的lib绑定:

$ strings site-packages/cryptography/hazmat/bindings/_openssl.so | grep OpenSSL -m1  
OpenSSL 1.1.1a  20 Nov 2018  
$ python -c "from cryptography.hazmat.backends.openssl import backend as b; print b.openssl_version_text()"  
OpenSSL 1.1.1a  20 Nov 2018  
$ python -c "from OpenSSL import SSL; print SSL.SSLeay_version(0)"  
OpenSSL 1.1.1a  20 Nov 2018  
$ python -c "import requests; print requests.get('https://www.howsmyssl.com/a/check').json()['tls_version']"  
TLS 1.3  

加密轮包含一个静态链接的OpenSSL绑定,它确保您可以访问最新的OpenSSL版本,而不会损坏您的系统依赖关系。
这将允许您继续使用相对较旧的Linux发行版(如LTS发行版),同时确保您的Python程序具有最新的OpenSSL。(https://cryptography.io/en/latest/installation/)

在Python2中,标准库的ssl模块从2.7版开始显式支持PROTOCOL_TLSv1_2标志。9,而在Python3中-从3.4版开始;但是TLSv1。仅当且仅当TLSv1时,2个连接才会工作。在编译Python并与之链接时,系统中已经有了支持2的系统级OpenSSL库。TLSv1。2至少需要OpenSSL 1.0。1来运行,但OpenSSL 1.0。通常建议使用2(或更高版本)(默认情况下使用TLSv1.2)。

如果您有Python2.7。9或3.4,其ssl模块实际上是根据系统openssl(比如v1)编译的。0.2k,那么即使是旧的pip(如v6.0.8),在撰写本文时仍将使用PyPI,您甚至不需要加密。要检查标准库Pythonssl和系统openssl版本:
$Python-c“导入ssl;打印(ssl.openssl\u版本)”

即使我们升级了一些过时的发行版提供的openssl,或者编译了最新的openssl,我们也不能仅仅将现有的Python安装重新链接到它:ssl模块在编译/安装Python时硬链接到系统提供的openssl,反之亦然。因此,基本上,如果不重新编译/重新安装Python本身(至少应该是版本2.7.9/3.4)将其链接到新的系统openssl库,就无法利用新的TLS协议。这就是上述pyopensslcryptography方法的用武之地。

快乐歌唱!:)

 类似资料:
  • 我以前在其他文章中看到过这个问题,建议在安装python包时使用可信主机前缀。这一直对我有效,但现在,无论出于什么原因,不再有效。这是我通过Pypi安装任何Python包时得到的消息。组织。不管涉及什么包,我都会得到同样的错误。 我试图改变condarc文件,将ssl_verify为false,这似乎没有帮助,我得到了同样的消息。有什么想法吗? 我正在通过Anaconda运行最新版本的Python

  • 我正在为Cisco CMX设备使用REST API,并试图编写Python代码,该代码向API发出获取信息的GET请求。代码如下,与文件中的代码相同,只是更改了必要的信息。 然而,我不断得到以下错误: 我还尝试更新OpenSSL,但没有效果。

  • 安装TF时出现异常: 文件“/usr/local/lib/python2.7/dist packages/pip/_vendor/cachecontrol/adapter.py”,第46行,在send resp=super(CacheControlAdapter,self)中。send(request,**kw)File“/usr/local/lib/python2.7/dist packages

  • 问题内容: 我试图使用pip在ubuntu上安装django。但不幸的是我遇到了这样的错误。有人可以解释一下并告诉我一些解决方法吗? 问题答案: 不要使用sudo而是使用虚拟环境,如下所示: 完成后;键入deactivate以退出虚拟环境:

  • 我安装twisted时遇到问题 PIP1.1 from/home/chris/GL/GLBackend/glenv/lib/python2.7/site-packages/pip-1.1-py2.7.egg(python 2.7) 创建虚拟环境 在glenv/bin/python2.7中创建新的python可执行文件也在glenv/bin/python中创建可执行文件安装分发...........

  • 问题内容: 我正在尝试使用通过该–选项创建的新virtualenv安装MySQL_python适配器的1.2.2版本。PyPi中显示的当前版本是1.2.3。有没有安装旧版本的方法?我发现有一篇文章指出应该这样做: 但是,安装后,它仍显示在站点包中。这是此软件包专用的问题,还是我做错了什么? 问题答案: TL; DR: (即) 首先,我发现你要执行的操作有两个问题。由于已经安装了版本,因此应该卸载当