以前我曾经通过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 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警报协议版本


如何解决此错误?

最佳答案

发生SSLError的原因是,系统OpenSSL库版本(在编译时链接到您的Python的版本)在安装Python或当下的当前Python版本低于2.7.9 / 3.4的那一天低于1.0.1,因为这两个版本均未真正支持TLS Python软件包索引(PyPI)now requirespip连接的1.2协议版本。

发行版通常无法轻松升级旧的openssl和系统Python,而不进行完整的OS升级,这并非总是如此。您可以从最近的sources编译自己的“非系统” OpenSSL,然后尝试编译一个独立的“非系统” Python将其链接到刚编译的OpenSSL,但是由于以下原因,这种方法也不可行各种限制。



流行的建议(例如pip安装请求[安全]或urllib3 [安全])通常无法帮助修复pip,因为pip itselfaffected并且将无法连接到PyPI来安装任何内容。我们不能要求pip连接到PyPI来解决pip无法连接到PyPI的问题。 :)要在不升级Python的情况下修复它,我们需要手动安装相关的软件包,以解决依赖关系:


PyOpenSSLcryptography(其manylinux1轮附带了更新的openssl库);
它们的依存关系:asn1cryptocffienum34idnaipaddresspycparsersix;
任何pip 10+版本,因为较早的pip版本并未真正使用加密-仅标准库的ssl模块(如果您已经是10或更高版本,则不需要新的pip版本,任何pip v10 +都可以使用)



  在具有旧的无效pip和过时的系统openssl版本的古老Ubuntu上进行了测试。


步骤1-下载

通过您选择的Web浏览器从Python Packing Index(pypi.org)下载以下软件包-为您的OS /平台选择最新的manylinux1轮子(.whl):


  pipasn1cryptoenum34idnasixipaddresspyOpenSSLcfficryptography滚轮;还有pycparser(非转盘,它将是tar.gz)


cp27-代表Python 2.7,cp36-代表Python 3.6;
多种类型的manylinux滚轮是常见的选择,因为它们适用于以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密码轮可以与任何Python版本> = 3.4一起使用,因为abi3 support Python3的多个版本,例如cryptography-2.5-cp34-abi3-manylinux1_x86_64.whl(2.4 MB)

基本上,wheel是具有特殊格式的文件名和.whl扩展名的ZIP存档,其中包含可重定位的Python包。该软件包可以是纯python的,也可以具有用于python绑定的预编译C库,因此可以安装它而无需具有某些系统依赖项,例如gcc,python-dev和其他C头文件/库,这通常对于经典的.tar.gz格式软件包。这也允许使用每个车轮内捆绑的程序的确切版本。 PEP-513中采用了manylinux1_ {x86_64,i686}滚轮平台标记,该标记将在许多linux系统上工作,包括流行的常用桌面和服务器发行版。期待将来有很多linux2标签!

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

没有其他文件(下载的轮子除外),也没有子目录!

第2步-安装

如果您当前的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/*
    Python 3中的$ pip3

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

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


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


  注意:除非您安装在Python virtualenv或venv中,否则强烈建议始终对pip使用--user标志。然后,它将python软件包部署到〜/ .local / lib /中的主目录下。实际上,在最新发行版的发行版中,由python3-pippython-pip软件包提供的发行补丁的pip版本中,默认情况下此选项始终为On。例如Ubuntu,Debian,Fedora等。请尝试avoid sudo pip,因为使用具有root访问权限的pip会干扰您的OS软件包管理器子系统(apt,yum等),并且可能affect依赖于以下操作系统的基本组件发行版提供的系统python。


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

恭喜你!现在,您的点应该可以与PyPI一起使用,并且您可以尝试从在线PyPI存储库中查找类似pip search colorama的内容。

校验

您可以通过直接查询已安装的pyOpenSSL lib来查看系统SSL / TLS设置的详细摘要:
$ python -m OpenSSL.debug
(ModuleNotFoundError表示未安装pyOpenSSL软件包)

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

为什么有效

较早版本的pip(在10之前)仅使用标准库的ssl模块(这是系统OpenSSL库的Python API),而不会回退到其他库,例如cryptography。从版本10开始,如果环境中存在pip,则现在可以将pyOpenSSL与加密一起使用。

manylinux1软件包的cryptography滚轮包括最新的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/


在Python 2中,标准库的ssl模块从版本2.7.9开始显式支持PROTOCOL_TLSv1_2标志,而在Python 3中-从版本3.4开始;但是TLSv1.2连接仅在且仅当在编译和链接Python时已在系统中启用了支持TLSv1.2的系统范围的OpenSSL库时,TLSv1.2连接才起作用。 TLSv1.2至少需要OpenSSL 1.0.1才能运行,但是通常建议使用OpenSSL 1.0.2(或更高版本)(默认情况下使用TLSv1.2)。

如果您确实有Python 2.7.9+或3.4+,并且实际上已经针对系统openssl(例如v1.0.2k)编译了它的ssl模块,那么即使是旧的pip(例如v6.0.8)也可以在撰写本文时,您已经开始使用PyPI,并且您甚至不需要密码。要检查标准库Python ssl和系统openssl版本:
$ python -c "import ssl; print(ssl.OPENSSL_VERSION)" && openssl version
OpenSSL 0.9.8o 2010年6月1日

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

祝你生日快乐! :)

09-11 11:21
查看更多