以前我以前是通过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警报协议版本
如何解决此错误?
答案 0 :(得分:4)
发生SSLError的原因是系统OpenSSL库版本(编译时链接到您的Python的版本)低于1.0.1 安装Python的日期或您当前的Python版本低于2.7.9。 / 3.4,因为它们都不真正支持TLS 1.2协议版本,该协议必须由pip
的Python软件包索引(PyPI)now requires连接。
发行版通常无法轻松升级旧的openssl和系统Python,而不进行完整的OS升级,这并非总是如此。您可以从最近的sources编译自己的“非系统” OpenSSL,然后尝试将独立的“非系统” Python链接到刚刚编译的OpenSSL,但有时这种方法是由于各种限制,也是不可行的。
受欢迎的建议(例如pip安装请求[安全]或urllib3 [安全])通常无法帮助修复pip
,因为pip itself是affected,并且无法连接到PyPI以安装任何内容。我们不能要求pip连接到PyPI来解决pip无法连接到PyPI的问题。 :)要在不升级Python的情况下修复它,我们需要手动安装相关的软件包,以解决依赖关系:
PyOpenSSL
和cryptography
(其manylinux1
滚轮提供了更新的openssl库); asn1crypto
,cffi
,enum34
,idna
,ipaddress
,pycparser
,six
; pip
10或更高版本,因为旧的pip版本并未真正使用加密-仅标准库的ssl
模块(如果您已经是10或更高版本,则不需要新的pip版本,任何点子v10 +都可以)在具有旧的无效pip和过时的系统openssl版本的古老Ubuntu上进行了测试。
下载通过Python Packing Index(pypi.org)的以下软件包-选择最新的 manylinux1 轮子( .whl )用于您的操作系统/平台:
pip,asn1crypto,enum34,idna,six,ipaddress,pyOpenSSL,cffi ,cryptography个轮子;还有pycparser(非转盘,它将是tar.gz)
cp27-代表Python 2.7, cp36-代表Python 3.6;
mu-类型的许多Linux轮子是常见的选择,因为它们适用于以UCS-4(UTF-32)格式存储Unicode数据的Python-以下是检查方法:
$ python -c "import sys; print('UCS4/UTF-32: mu-manylinux1' if sys.maxunicode > 65535 else 'UCS2/UTF-16: m-manylinux1')"
Python 3的注释:cp34-abi3-manylinux1
密码轮可以与 any Python版本> = 3.4一起使用,因为abi3 {{3}}的多个版本Python3,例如 cryptography-2.5-cp34-abi3-manylinux1_x86_64.whl(2.4 MB)
基本上, wheels 是具有特殊格式的文件名和.whl扩展名的ZIP存档,其中包含可重定位的Python包。该软件包可以是纯python的,也可以具有预编译的用于python绑定的C库,因此可以安装它而无需具有某些系统依赖性,例如gcc,python-dev和其他C标头/库,通常是经典.tar.gz格式软件包所必需的。这也允许使用每个车轮内捆绑的程序的确切版本。在support中采用了 manylinux1 _ {x86_64,i686}滚轮平台标记,该标记可在许多 linux系统上使用,包括常见的流行台式机和服务器发行版采用。希望将来有 manylinux2 标签!
只需创建一个新目录,例如:
$ mkdir ~/wheels_dir
并将所有下载的软件包复制(或移动)到该目录。
请没有其他文件(下载的轮子除外),也没有子目录!
如果您当前的pip
版本低于8.1,则必须先安装较新的pip版本,然后才能继续使用所有其他软件包:
$ pip install --user --no-index ~/wheels_dir/pip-19.0.1-py2.py3-none-any.whl
它将升级pip以处理新的 multilinux1 滚轮格式,并帮助避免“此平台上不支持的滚轮” 错误。
要在用户家庭级别安装所有软件包:
$ pip install --user --no-index ~/wheels_dir/*
$ pip3
在Python 3中
如果要在新的或现有的virtualenv中安装,请省略--user
选项:
$ source bin/activate
$ pip install --no-index ~/wheels_dir/*
Pip将自动解析正确的安装顺序和相关性。 (如果需要,也可以为此创建一个requirements.txt)
注意:除非您安装在Python virtualenv或venv中,否则强烈建议始终对pip使用
--user
标志。然后,它将python软件包部署在〜/ .local / lib /中的主目录下。实际上,在python3-pip
和{{提供的发行补丁的pip版本中,默认情况下,此选项始终为 On 1}}发行版的最新版本,例如Ubuntu,Debian,Fedora等。请尝试PEP-513python-pip
,因为使用具有root访问权限的pip会干扰您的操作系统程序包管理器子系统(apt,yum等),并且可能avoid依赖于发行版系统python的基本操作系统组件。
运行sudo pip
(或Python 3中的$ pip freeze
)命令以检查结果,并确保已为您的Python环境安装了所有软件包。
恭喜!现在,您的pip应该可以与PyPI一起使用,并且您可以尝试从在线PyPI存储库中查找类似pip3 freeze
的内容。
通过直接查询已安装的pip search colorama
库,您可以查看系统SSL / TLS设置的详细摘要:
pyOpenSSL
( ModuleNotFoundError 表示未安装pyOpenSSL软件包)
密码学链接的OpenSSL共享库与您的系统Python的openssl版本没有任何冲突。现在,这可能是个很好的机会,可以通过安装最新的python $ python -m OpenSSL.debug
软件包来将来更新根SSL证书的集合。
pip的早期版本(低于10)仅使用标准库的certifi
模块(这是系统OpenSSL库的Python API),而不会回退到ssl
之类的其他库。从版本10开始,如果环境中存在pip,则现在可以将pyOpenSSL与加密一起使用。
cryptography
软件包的manylinux1
轮子包括最新的OpenSSL库,无论您的平台是什么,它都支持高达v1.3的所有TLS协议(PyPI希望pip能够支持TLSv1.2)。这就是为什么这个轮子重2.1 Mb的原因-存档附带了一个共享的lib绑定:
cryptography
密码轮包含一个静态链接的OpenSSL绑定,可确保您可以访问最新的OpenSSL版本,而不会破坏系统依赖性。
这将允许您继续使用相对较旧的Linux发行版(例如LTS版本),同时确保您拥有适用于Python程序的最新OpenSSL。 (affect)
在Python 2中,标准库的$ 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
模块从版本2.7.9起开始显式支持PROTOCOL_TLSv1_2标志,而在Python 3中-从版本3.4开始;但是TLSv1.2连接仅在以下情况下有效:并且仅当在编译Python时系统中具有TLSv1.2的系统范围的OpenSSL库已可用时并反对它。 TLSv1.2至少需要OpenSSL 1.0.1才能运行,但是通常建议使用OpenSSL 1.0.2(或更高版本)(默认情况下使用TLSv1.2)。
如果您确实拥有Python 2.7.9+或3.4+,并且其ssl
模块实际上是针对系统openssl编译的,例如v1.0.2k,甚至是旧的pip(例如v6)。在撰写本文时, 0.8)仍将与PyPI一起使用,并且您甚至不需要密码。要检查标准库Python ssl
和系统openssl版本:
ssl
OpenSSL 0.9.8o 2010年6月1日
即使我们升级了一些过时的,由发行版提供的openssl或编译了最新的opensl,我们也不能仅仅将现有的Python安装重新链接到它:$ python -c "import ssl; print(ssl.OPENSSL_VERSION)" && openssl version
模块已硬链接到系统,在编译/安装Python时提供了OpenSSL,反之亦然。因此,基本上,如果不重新编译/重新安装Python本身(至少应为2.7.9+ / 3.4+版本)将其链接到新的系统openssl库,就无法利用新的TLS协议。这就是上述ssl
+ pyopenssl
的解决方法。
祝你生日快乐! :)