Больше не могу устанавливать пакеты Python 2 с помощью pip в Ubuntu 12.04 LTS (Precise Pangolin)
Версия TLS
TLS 1.1
Время обновить ваш Python: TLS v1.2 скоро будет обязательным
Детали ОС
Distributor ID: Ubuntu
Description: Ubuntu 12.04.2 LTS
Release: 12.04
Codename: Precise Pangolin
Версия Python
Python 2.7.3
Версия PIP
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) ошибка:1407742E: Подпрограммы SSL:SSL23_GET_SERVER_HELLO: версия протокола оповещения tlsv1
1 ответ
(Как правило, самый быстрый обходной путь в таких ситуациях, как обсуждалось, заключается в использовании Ubuntu apt-cache
а также apt-get
команды для легкого поиска и установки тысяч наиболее распространенных пакетов Python ( $ sudo apt-get install python-<packagename>
). Однако, как вы объяснили, некоторые из необходимых вам пакетов (например, цветные журналы) не были доступны в репозиториях диспетчера пакетов APT, нам нужно устранить основную причину, так что мы идем..)
error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version
можно воспроизвести как, запустив пункт с -v
или же -vvv
варианты (для многословия), наряду с SSLError
, No distributions found
, или же Max retries exceeded
Сообщения.
Curl (и wget) также не сможет подключиться к bootstrap.pypa.io (и некоторым другим защищенным веб-сайтам) с такой же ошибкой TLS, как и pip, если базовая библиотека OpenSSL системы (от которой все они зависят) устарела и не включает протокол TLS v1.2. Поскольку этот протокол теперь применяется на стороне сервера pip (индекс пакетов Python), начиная с этого месяца, соединения SSL не могут быть установлены. В таком случае, даже самая последняя версия pip 10.0.1 (которую можно установить вручную, см. Ниже) по-прежнему не сможет подключиться. Как упомянуто @phd, некоторые системные обновления должны быть:
OpenSSL. Python для Linux использует системный OpenSSL. Для работы TLS v1.2 требуется OpenSSL 1.0.1 (или более поздняя версия), но обычно рекомендуется минимум OpenSSL 1.0.2. В Ubuntu 12.04 ((Precise Pangolin) по крайней мере 1.0.1-4 доступен, так что вы можете попробовать:
$ openssl version $ sudo apt-get update && sudo apt-get install openssl libssl-dev
(Другой вариант - скомпилировать ваш собственный последний OpenSSL из исходников, который является единственным вариантом для более старых выпусков Ubuntu до 12.04.)
Пожалуйста, посмотрите, помогает ли обновление только этой библиотеки!
Колеса Следующее, что может помочь, это убедиться, что установлены следующие пакеты Python (зависимости, связанные с поддержкой Pythonic для работы OpenSSL и TLS):
pyasn1, certifi, asn1crypto, cryptography, pyOpenSSL, urllib3
Вы можете проверить, какой из них отсутствует, попробовав этот импорт в интерпретаторе Python (только один отсутствующий модуль будет сообщаться одновременно, слева направо):
>>> import pyasn1, certifi, asn1crypto, cryptography, OpenSSL, urllib3
Поскольку ваш пункт не может подключиться (пока), просто скачайте эти последние колеса с pypi.org через ваш любимый веб-браузер (см. Примеры ниже) по одному и установите колеса, используя
pip install --user <package-file.whl>
Команда в том же порядке, как указано выше, чтобы разрешить зависимости пипа.Примечание: ему должна предшествовать команда оболочки
$ sudo apt-get install build-essential libssl-dev libffi-dev python-dev
чтобы гарантировать возможность сборки этих пакетов Python.Пип. Если та же самая ошибка TLS сохраняется даже в системе с OpenSSL версии 1.0.1+, другой возможностью является обновление pip, как обсуждалось в этой теме. В идеале, в Ubuntu/Debian/Mint это должно быть сделано через apt-get, но мы уже знаем, что у вас есть Ubuntu 12.04, где доступен только старый пакет python-pip v1.0.1, так что... если обновление ОС не вариант. На самом деле можно загрузить и установить любую версию pip (и многие другие модули / пакеты), даже без наличия curl или wget в их системе:
- В своем веб-браузере перейдите на официальную веб-страницу индекса пакетов Python pypi.org и найдите пакет "pip",
- Выберите "Скачать файлы", вот прямая ссылка для pip: https://pypi.org/project/pip/
- Нажмите на файл пакета pip (.whl или tar.gz), чтобы загрузить, скажем, на рабочий стол и попытаться установить, например:
$ cd ~/Desktop $ pip install --user pip-10.0.1-py2.py3-none-any.whl $ pip --version
Однако: если системный пакет OpenSSL не был достаточно обновлен для поддержки протокола TLSv1.2, даже самый новый пункт не сможет установить соединение SSL (см. Выше). Поэтому лучше сначала обновить OpenSSL и посмотреть, сможет ли ваша текущая версия pip подключиться сразу.
Важно: обновление пипса, особенно через
pip install --upgrade
команда, может вызвать другую ошибку для решения. Вы должны знать о нюансах использования pip в системах на основе Debian, включая Ubuntu. На самом деле, python-пакеты из репозитория Ubuntu (такие как$ sudo apt-get install python-flask
) предпочтительны, где это возможно, особенно если они используются для всей системы, в противном случае рекомендуется virtualenv.Завиток Это на самом деле необязательно. Но если вы намеревались использовать его для загрузки get-pip.py, то curl (и libcurl3) необходимо обновить как минимум до версии 7.34, чтобы поддерживать соединения TLS 1.2. Однако даже ваш старый curl 7.22 по умолчанию должен работать, если у вас OpenSSL версии 1.0.2 (или выше), так как эта версия OpenSSL по умолчанию использует TLS 1.2, а pip также выполняет требование TLS v1.2.
Питон Имеет смысл сначала изучить вышеуказанные варианты. Стандартный модуль Python SSL под названием ssl (оболочка TLS/SSL) также использует системную библиотеку OpenSSL, как и pip. В Python 2
ssl
модуль начал поддерживать флаг PROTOCOL_TLSv1_2 явно с версии 2.7.9, а в Python 3 - с версии 3.4. В репозитории Ubuntu OS Python 2.7.9 впервые появился в 15.04 (Vivid Vervet), а Python 3.4.2 в 14.10 (Utopic Unicorn), что означает, что вы не можете безопасно обновить систему Python без обновления всех компонентов вашей ОС. Поскольку у вас 12.04 с Python 2.7.3, на этом этапе может помочь установка упомянутого выше модуля pyOpenSSL (и его зависимых друзей) - оболочки вокруг библиотеки OpenSSL. Фактически, он позволяет последним версиям pip подключаться к Pypi.org через скомпилированный OpenSSL 1.0.2 даже с Python 2.7.1!Обратите внимание, что Python версий 2.7.9+ и 3.4+ также поставляется с pip (pip3 для Python 3) с ними по умолчанию. Как обычно, apt-get рекомендуется для ОС на основе Debian. Более года назад было опубликовано соответствующее публичное объявление, поощряющее обновление платформы, но оно не содержало специфичных для Ubuntu системных инструкций Python. В Ubuntu мы используем диспетчер пакетов APT для обновлений / установок, где это возможно, но также возможно скомпилировать вашу собственную последнюю / пользовательскую версию Python в вашем домашнем каталоге пользователя как пользователь без полномочий root.
Источники всех версий Python доступны для компиляции на сайте www.python.org - в этом случае крайне важно поддерживать общесистемный Python на месте (
$ dpkg -l python
), и используйте вновь скомпилированную версию отдельно, в вашем домашнем каталоге пользователя и в virtualenv. Сохранение исходной версии Python для Ubuntu в целости и сохранности позволяет избежать нарушения зависимостей в Ubuntu, поскольку многие компоненты в данной версии ОС полагаются на версию Python для ОС.
Вам повезло в том смысле, что с Ubuntu 12.04, являющейся прежней версией LTS (долгосрочная поддержка), у вас всегда есть возможность apt-get upgrade
всю вашу ОС и переходите непосредственно к следующему выпуску LTS, который обычно обновляет OpenSSL, pip, Python, а также ваши общесистемные модули Python. Удачи!