无法再在 Ubuntu 12.04 LTS(Precise Pangolin)中使用 pip 安装任何 Python 2 个软件包

Cannot install any Python 2 packages using pip in Ubuntu 12.04 LTS (Precise Pangolin) anymore

TLS 版本

TLS 1.1

Time To Upgrade Your Python: TLS v1.2 Will Soon Be Mandatory

OS 详情

Distributor ID:    Ubuntu
Description:    Ubuntu 12.04.2 LTS
Release:    12.04
Codename:    Precise Pangolin

Python版本

Python 2.7.3

画中画版本

pip 1.0 from /usr/lib/python2.7/dist-packages (python 2.7)

我知道 pip SSL 证书存在问题,过去几个月我通过使用 --index-url 选项解决了这个问题。

但现在即使那个选项也不起作用。以下是我用来解决 SSL 问题的命令。

pip install --index-url=http://pypi.python.org/simple/ scapy

pip install --index-url=https://pypi.python.org/simple/ scapy

以上两个命令都出现以下错误:

Downloading/unpacking scapy
  Cannot fetch index base URL http://pypi.python.org/simple/
  Could not find any downloads that satisfy the requirement scapy
No distributions at all found for scapy
Storing complete log in /root/.pip/pip.log

同样,我无法安装任何 Python 软件包!

我该如何解决这个问题?


当我按照@phd 的建议尝试应用 时, 我收到以下错误,

curl: (35) error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version

快速解决方法:Ubuntu 包实用程序 apt-cacheapt-get 允许 数千个常见的 Python 包($ sudo apt-get install python-<packagename>).它们将比来自 pip 的内容更旧,但有些可能无法在 Ubuntu 存储库中找到。

error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version 可以通过 运行 pip 使用 -v(冗长)以及 SSLErrorNo distributions found、[=19= 进行复制] 消息。

Python for Linux 使用系统提供的 OpenSSL 库。 curlpip(以及 wget)也依赖于系统 OpenSSL 来建立 SSL 连接(使用 $ openssl version 命令)。但是 TLS 1.1 支持对于 pip any more 是不够的。 TLS v1.2 需要 OpenSSL 1.0.1(或更高版本)才能运行,但通常建议至少使用 OpenSSL 1.0.2。

Curl 的 libcurl 自 curl 版本 7.34, but older curl versions should be able to connect only if you had OpenSSL version 1.0.2 (or later). So, both pip and the curl commands you've tried fail because the operating system's underlying OpenSSL library version is below 1.0.1 (see $ openssl version command) which does not support TLS 1.2 required 起支持 TLS 1.2。要在 Python 解释器中查看它:

>>> import ssl
>>> ssl.OPENSSL_VERSION
'OpenSSL 0.9.8o 01 Jun 2010'
>>> ssl.PROTOCOL_TLSv1_2
 AttributeError: 'module' object has no attribute 'PROTOCOL_TLSv1_2'

问题的另一部分是 Python < 2.7.9(或 Python3 中的 <3.4)本身有 ssl 模块不支持 PROTOCOL_TLSv1_2,因此 pip 无法使用它,即使 openssl 是最新的。 Ubuntu 仓库中,Python 2.7.9 首次出现在 15.04 (Vivid Vervet),Python 3.4.2 出现在 14.10 (Utopic Unicorn),这意味着你不能升级系统 Python 安全而无需升级整个 OS 组件。 Python 2.7.9+ 和 3.4+ 版本通过 default.

发布了更新的 pip

从某种意义上说,你很幸运,因为 Ubuntu 12.04 是以前的 LTS(长期支持)版本,你总是可以选择 apt-get upgrade 你的整个 OS 和直接跳转到下一个 LTS 版本,它将升级从 OpenSSL 到 Python 的所有内容及其系统范围的模块。在您的 Ubuntu 12.04 (Precise Pangolin) 存储库的确切版本中,OpenSSL 1.0.1-4 可用(向后移植了安全更新),因此您可以尝试 $ sudo apt-get update && sudo apt-get install openssl libssl-dev 但它可能会导致依赖项的系统升级,而且没有 Python 升级就毫无意义。保持原始 Ubuntu-shipped Python 版本完整可以避免 breaking dependencies because many OS components 依赖 OS-shipped Python 版本。

您可以从您自己的非系统源代码编译 OpenSSL, then also your standalone non-system Python,将其链接到您刚刚编译的 OpenSSL,但是这种方法需要安装更多的“-dev”debian 软件包,并且可能不可行由于各种限制。

幸运的是,这一切都可以在不编译或升级 Python(以及整个系统)的情况下解决,通过手动安装几个 Python 包 -- 详细的分步指南是 available here on Whosebug. The cryptography manylinux1 wheel 发布了最新的静态链接 OpenSSL 库,它将启用 pip (v10+) 并允许您继续使用 Ubuntu 12.04 而无需重大升级麻烦。