gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:45:16 25 4
gpt4 key购买 nike

以前我曾经通过 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 routines: SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version



我该如何解决这个错误?

最佳答案

发生 SSLError 是因为系统 OpenSSL 库版本(编译时链接到您的 Python 的版本)在安装 Python 的那天低于 1.0.1 或您当前的 Python 版本低于 2.7.9/3.4,因为这些都不是真正支持 TLS Python Package Index (PyPI) now requires 1.2 协议(protocol)版本来自 pip连接。
发行版通常无法在不进行完整操作系统升级的情况下轻松升级旧的 openssl 和系统 Python,这并不总是可取的。您可以从最近的 sources 编译您自己的“非系统”OpenSSL然后尝试编译一个独立的“非系统”Python将其与您刚刚编译的 OpenSSL 链接,但有时由于各种限制,这种方法也不可行。
解决方案
流行的建议,例如 pip install requests[secure] 或 urllib3[secure],通常无法帮助修复 pip因为 pip itselfaffected并且无法连接到 PyPI 来安装任何东西。我们不能要求 pip 连接到 PyPI 来解决 pip 无法连接到 PyPI 的问题。 :) 要在不升级 Python 的情况下修复它,我们需要手动安装相关包,解决依赖关系:

  • PyOpenSSLcryptography (它的 manylinux1 轮子提供更新的 openssl 库);
  • 他们的依赖:asn1crypto , cffi , enum34 , idna , ipaddress , pycparser , six ;
  • 任何 pip 10+ 版本,因为旧的 pip 版本并没有真正使用密码学 - 只有标准库的 ssl模块(如果您的 pip 版本已经是 10 或更高版本,则不需要新的 pip 版本,任何 pip v10+ 都可以)

  • Tested on ancient Ubuntu with old non-working pip and outdated system openssl version.


    第 1 步 - 下载
    下载通过您选择的网络浏览器从 Python Packing Index (pypi.org) 获取以下软件包——为您的操作系统/平台选择最近的 manylinux1 轮子 ( .whl ):

    pip, asn1crypto, enum34, idna, six, ipaddress, pyOpenSSL, cffi, cryptography wheels; and also pycparser (a non-wheel, it will be a tar.gz)


    cp27- 代表 Python 2.7, cp36- 适用于 Python 3.6;
    亩- 类型 manylinuxwheels 是一个常见的选择,因为它们用于以 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)
    基本上, 车轮 是具有特殊格式文件名和 .whl 扩展名的 ZIP 文件,包含可重定位的 Python 包。包可以是pure-python,也可以有 预编译 用于 python 绑定(bind)的 C 库,因此它可以安装而无需某些系统依赖项,如 gcc、python-dev 和其他 C 头文件/库,经典 .tar.gz 格式包通常需要这些。这也允许使用捆绑在每个轮子中的程序的确切版本。 manylinux1 _{x86_64,i686} 车轮平台标签在 PEP-513 中被采用并将在许多 Linux 系统上工作,包括常用的流行桌面和服务器发行版。期待将来有 manylinux2 标签!
    只需创建一个新目录,例如: $ 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/* $ pip3在 Python 3 中
    如果安装在新的或现有的 virtualenv 中,请省略 --user选项:
    $ source bin/activate
    $ pip install --no-index ~/wheels_dir/*
    Pip 将自动解析正确的安装顺序和依赖项。
    (如果需要,也可以为此创建一个 requirements.txt)

    Note: Unless you install in a Python virtualenv or venv, it is highly recommended to always use --user flag with pip. It then deploys python packages under your home dir in ~/.local/lib/ In fact, this option is always On by default in distro-patched pip versions provided by python3-pip and python-pip packages in recent versions of popular distros such as Ubuntu, Debian, Fedora, etc. Please try to avoid sudo pip, as using pip with root access interferes with your OS package manager subsystem (apt, yum, etc) and may affect essential OS components that depend on the distro-supplied system python.


    运行 $ pip freeze (或 Python 3 中的 pip3 freeze)命令来检查结果并确保已为您的 Python 环境安装了所有包。
    恭喜!现在您的 pip 应该可以与 PyPI 一起使用了,您可以尝试查找类似 pip search colorama 的内容。来自在线 PyPI 存储库。
    验证
    您可以通过查询已安装的 pyOpenSSL 来查看系统 SSL/TLS 设置的详细摘要。直接lib: $ 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 库支持所有 TLS 协议(protocol)高达 v1.3,无论您的平台上有什么(PyPI 期望 pip 支持 TLSv1.2)。这就是这个轮子重 2.1 Mb 的原因——文件提供了一个共享的 lib 绑定(bind)​​:
    $ 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

    The Cryptography wheel contains a statically-linked OpenSSL binding, which ensures that you have access to the most-recent OpenSSL releases without corrupting your system dependencies.
    This will allow you to continue to use relatively old Linux distributions (such as LTS releases), while making sure you have the most recent OpenSSL available to your Python programs. (https://cryptography.io/en/latest/installation/)


    在 Python 2 中,标准库的 ssl模块从 2.7.9 版开始明确支持 PROTOCOL_TLSv1_2 标志,而在 Python 3 中 - 从 3.4 版开始;但 TLSv1.2 连接只能工作 当且仅当 支持 TLSv1.2 的系统范围的 OpenSSL 库是 已经可用 在 Python 被编译并链接到它时在系统中。 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版本: $ python -c "import ssl; print(ssl.OPENSSL_VERSION)" && openssl versionOpenSSL 0.9.8o 2010 年 6 月 1 日
    即使我们升级了一些过时的发行版提供的 openssl,或者编译了最新的 openssl,我们也不能只是将现有的 Python 安装重新链接到它: ssl在编译/安装 Python 时,模块被硬链接(hard link)到系统提供的 OpenSSL,反之亦然。因此,基本上,如果不重新编译/重新安装 Python 本身(至少应该是 2.7.9+/3.4+ 版本)将其链接到新的系统 openssl 库,就无法利用新的 TLS 协议(protocol)。这是上面 pyopenssl的地方+ cryptography方法来拯救。
    快乐的 TLSing! :)

    关于python - 无法在 Ubuntu Linux 中使用 pip 安装 Python 包 : InsecurePlatformWarning, SSLError,tlsv1 警报协议(protocol)版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51646558/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com