Больше не могу устанавливать пакеты 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, некоторые системные обновления должны быть:

  1. 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.)

    Пожалуйста, посмотрите, помогает ли обновление только этой библиотеки!

  2. Колеса Следующее, что может помочь, это убедиться, что установлены следующие пакеты 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.

  3. Пип. Если та же самая ошибка 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.

  4. Завиток Это на самом деле необязательно. Но если вы намеревались использовать его для загрузки 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.

  5. Питон Имеет смысл сначала изучить вышеуказанные варианты. Стандартный модуль 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. Удачи!

Другие вопросы по тегам