Certbot: ImportError: в модуле pyOpenSSL отсутствуют необходимые функции

Созданный на 17 апр. 2017  ·  35Комментарии  ·  Источник: certbot/certbot

Моя операционная система (включая версию):

Версия CentOS Linux 7.3.1611

Я установил Certbot с помощью (certbot-auto, диспетчера пакетов ОС, pip и т. Д.):

Диспетчер пакетов ОС

Я выполнил эту команду, и она выдала следующий результат:

certbot продлить

Отслеживание (последний вызов последний):
Файл "/ bin / certbot", строка 7, в
from certbot.main import main
Файл "/usr/lib/python2.7/site-packages/certbot/main.py", строка 17, в
из клиента импорта certbot
Файл "/usr/lib/python2.7/site-packages/certbot/client.py", строка 10, в
из клиента импорта acme как acme_client
Файл "/usr/lib/python2.7/site-packages/acme/client.py", строка 31, в
request.packages.urllib3.contrib.pyopenssl.inject_into_urllib3 () # тип: игнорировать
Файл "/usr/lib/python2.7/site-packages/requests/packages/urllib3/contrib/pyopenssl.py", строка 112, в inject_into_urllib3
_validate_dependencies_met ()
Файл "/usr/lib/python2.7/site-packages/requests/packages/urllib3/contrib/pyopenssl.py", строка 147, в _validate_dependencies_met
поднять ImportError ("В модуле 'pyOpenSSL' отсутствуют необходимые функции."
ImportError: в модуле pyOpenSSL отсутствуют необходимые функции. Попробуйте перейти на версию 0.14 или новее.

Поведение Certbot отличалось от того, что я ожидал, потому что:

Он должен успешно обновляться вместо ошибок.

Вот журнал Certbot, показывающий проблему (если таковая имеется):

По умолчанию журналы хранятся в /var/log/letsencrypt . Не стесняйтесь редактировать домены, электронную почту и IP-адреса по своему усмотрению.

Нет записей в журнале. Я удалил pyopenssl и переустановил его.

pip show pyOpenssl

Имя: pyOpenSSL
Версия: 16.2.0
Описание: модуль оболочки Python для библиотеки OpenSSL
Домашняя страница: https://pyopenssl.readthedocs.io/
Автор: Хайнек Шлавак
Электронная почта автора: [email protected]
Лицензия: Лицензия Apache, версия 2.0
Расположение: /usr/lib64/python2.7/site-packages
Требуется: шесть, криптография

Но ошибка все еще сохраняется. Любая идея ?

Самый полезный комментарий

Ребята, не путайте yum установленные пакеты через pip . Правильное исправление включает удаление пакетов pip и установку всего из yum . Я обрисовал это здесь .

Вам не нужен более новый pyOpenSSL на CentOS 7 для запуска certbot! Нельзя сказать, что полагаться на третьи пакеты в конечном итоге ни к чему хорошему не приведет :)

pip uninstall requests
yum reinstall python-requests

pip uninstall six
yum reinstall python-six

pip uninstall urllib3
yum reinstall python-urllib3

Все 35 Комментарий

Возможно, существует несколько версий pyOpenSSL, поэтому urllib3 запутается. В /usr/lib/python2.7/site-packages/requests/packages/urllib3/contrib/pyopenssl.py должно быть несколько строк вроде этой:

    # pyOpenSSL 0.14 and above use cryptography for OpenSSL bindings. The _x509
    # attribute is only present on those versions.
    from OpenSSL.crypto import X509
    x509 = X509()
    if getattr(x509, "_x509", None) is None:
        raise ImportError("'pyOpenSSL' module missing required functionality. "
                          "Try upgrading to v0.14 or newer.")

Не могли бы вы добавить отладочные коды и посмотреть, что будет на выходе?

    # pyOpenSSL 0.14 and above use cryptography for OpenSSL bindings. The _x509
    # attribute is only present on those versions.
    import OpenSSL.crypto
    print(OpenSSL.crypto)
    from OpenSSL.crypto import X509
    x509 = X509()
    if getattr(x509, "_x509", None) is None:
        raise ImportError("'pyOpenSSL' module missing required functionality. "
                          "Try upgrading to v0.14 or newer.")

Помните, что Python не любит вкладки. Всегда вставляйте пробелы для идентификации. Кроме того, для изменения этого файла вам потребуется root.

Вот результат:

certbot продлить



Отслеживание (последний вызов последний):
Файл "/ bin / certbot", строка 7, в
from certbot.main import main
Файл "/usr/lib/python2.7/site-packages/certbot/main.py", строка 17, в
из клиента импорта certbot
Файл "/usr/lib/python2.7/site-packages/certbot/client.py", строка 10, в
из клиента импорта acme как acme_client
Файл "/usr/lib/python2.7/site-packages/acme/client.py", строка 31, в
request.packages.urllib3.contrib.pyopenssl.inject_into_urllib3 () # тип: игнорировать
Файл "/usr/lib/python2.7/site-packages/requests/packages/urllib3/contrib/pyopenssl.py", строка 112, в inject_into_urllib3
_validate_dependencies_met ()
Файл "/usr/lib/python2.7/site-packages/requests/packages/urllib3/contrib/pyopenssl.py", строка 149, в _validate_dependencies_met
поднять ImportError ("В модуле 'pyOpenSSL' отсутствуют необходимые функции."
ImportError: в модуле pyOpenSSL отсутствуют необходимые функции. Попробуйте перейти на версию 0.14 или новее.

/usr/lib64/python2.7/site-packages/OpenSSL/crypto.so

Этот путь похож на более ранний пакет pyOpenSSL. Не могли бы вы удалить pyOpenSSL через yum и повторить попытку?

У меня такая же проблема на centos7. Удаление pyOpenSSL.x86_64 0: 0.13.1-3.el7 не помогает, потому что yum install certbot переустановит его снова.

Однако я нашел обходной путь для сломанного RPM:

yum remove pyOpenSSL.x86_64
cd
mkdir virtualenv
cd virtualenv/
virtualenv --no-site-packages -p /usr/bin/python2.7 certbot
. ~/virtualenv/certbot/bin/activate
pip import six packaging appdirs
pip install setuptools --upgrade                                                                                                                                                                                    pip install certbot
certbot help

Такая же проблема здесь при новой установке centos.

rpm --query centos-release  # centos-release-7-3.1611.el7.centos.x86_64
wget ftp://ftp.muug.mb.ca/mirror/centos/7.3.1611/cloud/x86_64/openstack-mitaka/common/pyOpenSSL-0.15.1-1.el7.noarch.rpm
sudo rpm -Uvh pyOpenSSL-0.15.1-1.el7.noarch.rpm
sudo yum install certbot
certbot renew  # OK

Я думаю, что это скорее проблема CentOS, чем certbot. Может ли кто-нибудь сообщить CentOS, что их pyOpenSSL слишком старый?

Проблема сохранялась в моей системе даже после обновления до pyOpenSSL 16.something

Та же проблема возникла недавно на моей машине CentOS 7.
Единственный рабочий обходной путь - pip install pyOpenSSL=0.13.1

Последние два месяца это не удалось.
И я попробовал снова только сейчас, снова не удалось.

Выход:

>> sudo certbot certonly --standalone -d mydomain.com

<< Traceback (most recent call last):
  File "/bin/certbot", line 9, in <module>
    load_entry_point('certbot==0.12.0', 'console_scripts', 'certbot')()
  File "/usr/lib/python2.7/site-packages/pkg_resources.py", line 378, in load_entry_point
    return get_distribution(dist).load_entry_point(group, name)
  File "/usr/lib/python2.7/site-packages/pkg_resources.py", line 2566, in load_entry_point
    return ep.load()
  File "/usr/lib/python2.7/site-packages/pkg_resources.py", line 2260, in load
    entry = __import__(self.module_name, globals(),globals(), ['__name__'])
  File "/usr/lib/python2.7/site-packages/certbot/main.py", line 21, in <module>
    from certbot import client
  File "/usr/lib/python2.7/site-packages/certbot/client.py", line 10, in <module>
    from acme import client as acme_client
  File "/usr/lib/python2.7/site-packages/acme/client.py", line 31, in <module>
    requests.packages.urllib3.contrib.pyopenssl.inject_into_urllib3()
  File "/usr/lib/python2.7/site-packages/requests/packages/urllib3/contrib/pyopenssl.py", line 112, in inject_into_urllib3
    _validate_dependencies_met()
  File "/usr/lib/python2.7/site-packages/requests/packages/urllib3/contrib/pyopenssl.py", line 147, in _validate_dependencies_met
    raise ImportError("'pyOpenSSL' module missing required functionality. "
ImportError: 'pyOpenSSL' module missing required functionality. Try upgrading to v0.14 or newer.

Затем я пробую это, и это работает:

_20170502100430

Ссылка для ответа: https://serverfault.com/questions/830284/certbot-for-letsencrypt-missing-pyopenssl-module

Просто для справки ... как правило, обновлять pyOpenSSL через pip на CentOS небезопасно, поскольку таким образом можно сломать yum.

Какой пакет certbot вы используете? Я был бы признателен, если бы вы могли установить 0.13.0 из epel-testing и всегда следить за тем, чтобы в вашей системе было полное обновление yum.

Возможно, вам потребуется использовать yum переустановить pyOpenSSL для восстановления вашей системы (проверьте его состояние с помощью rpm -qV pyOpenSSL).

В этом пакете есть проблема с таймером обновления systemd, поэтому я не сделал его стабильным, но просто выполнение запросов certbot и ручное обновление certbot будут работать.

Релиз 0.14.0 тоже на подходе ... и я буквально только что протестировал это в AWS.

Мне любопытно - первоначальный автор установил его через диспетчер пакетов, так где же нам закрепить версию для pip?
У людей все еще есть эта проблема? И если да, то какой метод установки вы используете?

Вы можете попробовать метод, описанный в этом Dockerfile, который у меня сработал:
https://github.com/identinetics/docker-nginx/blob/master/Dockerfile#L65

По-прежнему существует проблема с недавно установленной и обновленной версией CentOS 7.3.
Устранена проблема, установив обновленную версию pyOpenSSL rpm (pyOpenSSL-0.14-3.fc222 показалось достаточно, в то время как pyOpenSSL-16.2.0-1.fc25 не работал), но как быть уверенным, что он ничего не сломает ?!

https://www.rpmfind.net/linux/rpm2html/search.php?query=pyOpenSSL

Спасибо

@ tisc0 Меня очень интересует более подробная информация о том, как именно вы установили и запустили это, чтобы решить эту проблему.

Когда я создавал пакеты certbot centos7, я без проблем тестировал их в AWS - конечно, не то, что вы описали или описывает эта проблема.

Ужасная идея устанавливать подобный rpm-пакет Fedora непосредственно на centos7, особенно с таким основным пакетом, как pyOpenSSL.

Привет, Хогартдж,
Извините за отсутствие деталей, в эти дни вроде бы занято :)
Суммируя :

  • установка Fedora rpm не решила проблему (работал только certbot --help, насколько я помню)
  • после долгой игры с пакетами и проверки того, что он действительно работает в другом свежем centos 7 (без коробочных пакетов), я переустановил их и, наконец, получил еще одну ошибку о urllib3 (также с просьбой установить обновленную версию, которая Не покупал;]).
  • Я решил удалить / переустановить urllib3 с помощью yum (а не с помощью rpm -e) и всех зависимых пакетов; в этом случае ipa-client также нуждается в некоторых общих пакетах ...
  • Я переустановил (именно в таком порядке) urllib3 и certbot: все заработало
  • Я наконец переустановил ipa-client, и теперь он работает.

[ root @ c7-dse ~] # echo N | ням удалить python-urllib3 | awk '{print $ 1}'
(...)
Зависимости

==============
Упаковка
Удаление:
python-urllib3
Удаление
Certbot
ipa-клиент
python-запросы
python2-acme
python2-certbot
python2-ipaclient
python2-ipalib

Любая идея объяснить, почему переустановка некоторых пакетов заставила его работать, приветствуется :)

@ tisc0 спасибо за дополнительную информацию

Принудительная установка / удаление пакетов часто может вызывать проблемы - как и обновления системных библиотек с помощью пакетов.

Редко бывает хорошей идеей просто взять пакет Fedora для использования CentOS, не выполняя перестройку самого пакета из src.rpm.

При переустановке пакетов (вместо того, чтобы выполнять удаление и установку с проблемами зависимостей, yum переустановка может быть спасением), проверяется наличие исходных файлов.

Я очень рад слышать, что переустановка пакетов CentOS помогает вам :)

Поскольку у @ tisc0, похоже, есть рабочая настройка, я собираюсь закрыть эту проблему. Если у кого-то все еще есть проблемы, напишите о новой проблеме, так как эта ветка становится довольно переполненной.

для CentOS7: просто сделайте «mv /usr/lib64/python2.7/site-packages/OpenSSL /usr/lib64/python2.7/site-packages/pyOpenSSL», и это сработает для меня как шарм !!!

Грязный хак: 1st_place_medal:;)

У меня была такая же проблема, потому что pip install -U перезаписал модули python, установленные из RPM.

Чтобы решить эту проблему, я сделал следующее:

проблема

  File "/usr/lib/python2.7/site-packages/urllib3/contrib/pyopenssl.py", line 147, in _validate_dependencies_met
    raise ImportError("'pyOpenSSL' module missing required functionality. "
ImportError: 'pyOpenSSL' module missing required functionality. Try upgrading to v0.14 or newer.

решение

[root<strong i="12">@kolla</strong> ~]# rpm -qf /usr/lib64/python2.7/site-packages/OpenSSL/
pyOpenSSL-0.13.1-3.el7.x86_64
[root<strong i="13">@kolla</strong> ~]# rpm -qf /usr/lib/python2.7/site-packages/urllib3
python-urllib3-1.10.2-2.el7_1.noarch

[root<strong i="14">@kolla</strong> ~]# rpm --nodeps -e python-urllib3
[root<strong i="15">@kolla</strong> ~]# rm -rf /usr/lib/python2.7/site-packages/urllib3/
[root<strong i="16">@kolla</strong> ~]# yum -y install python-urllib3

проблема

  File "/usr/lib/python2.7/site-packages/requests/__init__.py", line 90, in <module>
    from urllib3.exceptions import DependencyWarning
ImportError: cannot import name DependencyWarning
[root<strong i="20">@kolla</strong> ~]# rpm -qf /usr/lib/python2.7/site-packages/requests
python-requests-2.6.0-1.el7_1.noarch

решение

[root<strong i="24">@kolla</strong> ~]# rpm --nodeps -e python-requests
[root<strong i="25">@kolla</strong> ~]# rm -rf /usr/lib/python2.7/site-packages/requests
[root<strong i="26">@kolla</strong> ~]# yum -y install python-requests   

Обновление от 29 января 2018 г .:

Снова столкнулся с той же проблемой, на этот раз было намного проще использовать контейнер докеров :)

alias certbot='docker run --rm -ti -v /etc/letsencrypt:/etc/letsencrypt -p 80:80 certbot/certbot:v0.21.1'

@cnritng У меня тоже работает

Любой, у кого все еще есть эта проблема, попробуйте следующее:

rpm --query centos-release  # centos-release-7-3.1611.el7.centos.x86_64
wget ftp://ftp.muug.ca/mirror/centos/7/cloud/x86_64/openstack-newton/common/pyOpenSSL-0.15.1-1.el7.noarch.rpm
sudo rpm -Uvh pyOpenSSL-0.15.1-1.el7.noarch.rpm
sudo yum install certbot
certbot renew  # OK

из @sulliwane . обратите внимание, что адрес ftp://ftp.muug.ca/mirror/... изменился.

Спасибо @JellyBool

Ребята, не путайте yum установленные пакеты через pip . Правильное исправление включает удаление пакетов pip и установку всего из yum . Я обрисовал это здесь .

Вам не нужен более новый pyOpenSSL на CentOS 7 для запуска certbot! Нельзя сказать, что полагаться на третьи пакеты в конечном итоге ни к чему хорошему не приведет :)

pip uninstall requests
yum reinstall python-requests

pip uninstall six
yum reinstall python-six

pip uninstall urllib3
yum reinstall python-urllib3

Вышеупомянутые шаги от @dvershinin помогли мне

также есть вещи, работающие с тем, что опубликовал @dvershinin . просто нужно было изменить последнюю строку с «yum переустановить python-urllib3» на «yum install python-urllib3»

для CentOS7: просто сделайте «mv /usr/lib64/python2.7/site-packages/OpenSSL /usr/lib64/python2.7/site-packages/pyOpenSSL», и это сработает для меня как шарм !!!

Система, подобная * nix, всегда имеет аналогичные проблемы: нарушена файловая зависимость.

https://github.com/certbot/certbot/issues/4514#issuecomment -375741595
работал на меня

Ребята, не путайте yum установленные пакеты через pip . Правильное исправление включает удаление пакетов pip и установку всего из yum . Я обрисовал это здесь .

Вам не нужен более новый pyOpenSSL на CentOS 7 для запуска certbot! Нельзя сказать, что полагаться на третьи пакеты в конечном итоге ни к чему хорошему не приведет :)

pip uninstall requests
yum reinstall python-requests

pip uninstall six
yum reinstall python-six

pip uninstall urllib3
yum reinstall python-urllib3

Спасибо! Это работает!

@dvershinin исправление делает notwork для меня в данный момент - после выполнения действий , он описал на Centos 7 я получаю следующее сообщение об ошибке:

VersionConflict: (urllib3 1.10.2 (/usr/lib/python2.7/site-packages), Requirement.parse ('urllib3> = 1.20, <1.26'))

@ keir-lavelle, мое исправление - это всего лишь попытка восстановить систему в исходное состояние после того, как она была серьезно повреждена с помощью pip под пользователем root (что многие учебники заставляют людей делать, без учета того факта, что это никогда не должно выполняться в системах CentOS / RHEL!)

Поэтому, если вы чувствуете себя авантюристом в его исправлении, вы можете перейти по ссылке, которую я дал, которая пытается исправить это дальше, удалив все пакеты Python (заметьте, yum тоже основан на Python), что, кроме того, является опасным предприятием. . (потому что вы можете сломать больше).

  • Если вы можете восстановить свой сервер из некоторого снимка / резервной копии, где работал certbot , тогда все будет в порядке
  • В противном случае «удалить все пакеты Python / переустановить» кажется единственным способом исправить (но обязательно учтите последствия этого, если по какой-то причине вы не можете перевести yum в рабочее состояние. ).

И, конечно, это помогает еще раз вспомнить: не используйте pip или python installs под root . Вот как он ломается в первую очередь. Если бы этого не случилось - не сломалось бы.

Спасибо, что нашли время объяснить, в данный момент я просто тестирую, поэтому сервер является одноразовым, так что ничего страшного, если он сломается, но ценю информацию

Была ли эта страница полезной?
0 / 5 - 0 рейтинги