Certbot: ImportError: módulo 'pyOpenSSL' sem a funcionalidade necessária

Criado em 17 abr. 2017  ·  35Comentários  ·  Fonte: certbot/certbot

Meu sistema operacional é (incluir versão):

CentOS Linux versão 7.3.1611

Instalei o Certbot com (certbot-auto, gerenciador de pacotes do sistema operacional, pip, etc):

Gerenciador de empacotador de sistema operacional

Executei este comando e ele produziu esta saída:

renovar certbot

Traceback (última chamada mais recente):
Arquivo "/ bin / certbot", linha 7, em
de certbot.main import main
Arquivo "/usr/lib/python2.7/site-packages/certbot/main.py", linha 17, em
do cliente de importação certbot
Arquivo "/usr/lib/python2.7/site-packages/certbot/client.py", linha 10, em
do cliente de importação acme como acme_client
Arquivo "/usr/lib/python2.7/site-packages/acme/client.py", linha 31, em
request.packages.urllib3.contrib.pyopenssl.inject_into_urllib3 () # type: ignore
Arquivo "/usr/lib/python2.7/site-packages/requests/packages/urllib3/contrib/pyopenssl.py", linha 112, em inject_into_urllib3
_validate_dependencies_met ()
Arquivo "/usr/lib/python2.7/site-packages/requests/packages/urllib3/contrib/pyopenssl.py", linha 147, em _validate_dependencies_met
raise ImportError ("Módulo 'pyOpenSSL' sem funcionalidade necessária."
ImportError: módulo 'pyOpenSSL' sem a funcionalidade necessária. Tente atualizar para v0.14 ou mais recente.

O comportamento do Certbot diferiu do que eu esperava porque:

Deve renovar com sucesso em vez de erros.

Aqui está um registro do Certbot mostrando o problema (se disponível):

Os logs são armazenados em /var/log/letsencrypt por padrão. Sinta-se à vontade para redigir domínios, endereços de e-mail e IP conforme desejar.

Sem entradas de registro. Eu removi o pyopenssl e o reinstalei.

pip show pyOpenssl

Nome: pyOpenSSL
Versão: 16.2.0
Resumo: Módulo wrapper Python em torno da biblioteca OpenSSL
Página inicial: https://pyopenssl.readthedocs.io/
Autor: Hynek Schlawack
E-mail do autor: [email protected]
Licença: Licença Apache, Versão 2.0
Localização: /usr/lib64/python2.7/site-packages
Requer: seis, criptografia

Mas o erro ainda persiste. Qualquer ideia ?

pkging

Comentários muito úteis

Pessoal, não misture yum pacotes instalados com pip uns. A correção adequada envolve remover pacotes pip e instalar tudo de yum . Eu o esbocei aqui .

Você não precisa do pyOpenSSL mais recente no CentOS 7 para executar o certbot! Não quer dizer que confiar em terceiros pacotes não levará você a nada de bom, eventualmente :)

pip uninstall requests
yum reinstall python-requests

pip uninstall six
yum reinstall python-six

pip uninstall urllib3
yum reinstall python-urllib3

Todos 35 comentários

Talvez existam várias versões de pyOpenSSL para que urllib3 fique confuso. Em /usr/lib/python2.7/site-packages/requests/packages/urllib3/contrib/pyopenssl.py, deve haver algumas linhas como esta:

    # 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.")

Você poderia adicionar alguns códigos de depuração e ver qual é o resultado?

    # 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.")

Esteja ciente de que o Python não gosta de guias. Sempre insira espaços para identificação. Além disso, você precisa do root para modificar este arquivo.

Aqui está o resultado:

renovar certbot



Traceback (última chamada mais recente):
Arquivo "/ bin / certbot", linha 7, em
de certbot.main import main
Arquivo "/usr/lib/python2.7/site-packages/certbot/main.py", linha 17, em
do cliente de importação certbot
Arquivo "/usr/lib/python2.7/site-packages/certbot/client.py", linha 10, em
do cliente de importação acme como acme_client
Arquivo "/usr/lib/python2.7/site-packages/acme/client.py", linha 31, em
request.packages.urllib3.contrib.pyopenssl.inject_into_urllib3 () # type: ignore
Arquivo "/usr/lib/python2.7/site-packages/requests/packages/urllib3/contrib/pyopenssl.py", linha 112, em inject_into_urllib3
_validate_dependencies_met ()
Arquivo "/usr/lib/python2.7/site-packages/requests/packages/urllib3/contrib/pyopenssl.py", linha 149, em _validate_dependencies_met
raise ImportError ("Módulo 'pyOpenSSL' sem funcionalidade necessária."
ImportError: módulo 'pyOpenSSL' sem a funcionalidade necessária. Tente atualizar para v0.14 ou mais recente.

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

Este caminho se parece com um pacote pyOpenSSL anterior. Você poderia remover o pyOpenSSL via yum e tentar novamente?

Estou tendo o mesmo problema no centos7. Remover pyOpenSSL.x86_64 0: 0.13.1-3.el7 não ajuda, porque yum install certbot irá reinstalá-lo novamente.

No entanto, encontrei uma solução alternativa para o RPM quebrado:

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

O mesmo problema aqui em uma instalação de centos nova.

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

Acho que isso é mais um problema do CentOS do que do certbot. Alguém pode informar ao CentOS que seu pyOpenSSL é muito antigo?

O problema persistiu no meu sistema, mesmo após uma atualização para pyOpenSSL 16.algo

O mesmo problema ocorreu recentemente em minha máquina CentOS 7.
A única solução alternativa é pip install pyOpenSSL=0.13.1

Nos últimos dois meses, ele falhou.
E tentei de novo agora, mas falhou de novo.

A saída:

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

Então eu tento e funciona:

_20170502100430

O link da resposta: https://serverfault.com/questions/830284/certbot-for-letsencrypt-missing-pyopenssl-module

Apenas para referência ... geralmente não é seguro atualizar o pyOpenSSL via pip no CentOS, pois é possível quebrar o yum dessa forma.

Qual pacote certbot você está usando? Eu apreciaria se você pudesse instalar o 0.13.0 a partir do epel-testing e sempre garantir que seu sistema tenha uma atualização completa do yum.

Você pode precisar usar yum reinstalar pyOpenSSL para reparar seu sistema (verifique o estado dele com rpm -qV pyOpenSSL).

Há um problema com o cronômetro de renovação do systemd com esse pacote, e é por isso que não o empurrei para estável, mas apenas fazer solicitações de certbot e uma renovação manual de certbot funcionará.

A versão 0.14.0 também está a caminho ... e eu literalmente acabei de testar isso na AWS.

Estou curioso - o autor original o instalou por meio de um gerenciador de pacotes, então onde colocaríamos uma versão para o pip?
As pessoas ainda estão tendo esse problema? E se sim, qual método de instalação você está usando?

Você pode tentar o método descrito neste Dockerfile, que funcionou para mim:
https://github.com/identinetics/docker-nginx/blob/master/Dockerfile#L65

Ainda tendo o problema no novo centOS instalado e atualizado 7.3.
Corrigido o problema instalando pyOpenSSL rpm atualizado (pyOpenSSL-0.14-3.fc222 parecia suficiente, enquanto pyOpenSSL-16.2.0-1.fc25 não funcionava), mas como ter certeza de que não está quebrando mais nada?!

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

Obrigado

@ tisc0 Estou muito interessado em mais detalhes sobre exatamente como você instalou e executou isso para resolver esse problema.

Quando criei os pacotes do certbot centos7, testei-os na AWS sem problemas - certamente não o que você descreveu ou esse problema descreve.

É uma péssima ideia instalar um fedora rpm como esse diretamente no centos7 - especialmente com um pacote básico como o pyOpenSSL.

Oi Hogarthj,
Desculpem a falta de detalhes, estou meio ocupado hoje em dia :)
Resumidamente :

  • a instalação do fedora rpm não resolveu o problema (apenas o certbot --help estava funcionando, pelo que me lembro)
  • depois de brincar muito com os pacotes, e verificar se estava realmente funcionando em outro centos 7 fresco (com pacotes prontos), eu os reinstalei e finalmente recebi outro erro sobre urllib3 (também pedindo para instalar uma versão atualizada, que Eu não comprei;]).
  • Decidi remover / reinstalar o urllib3 com yum (em vez de rpm -e) e todos os pacotes dependentes; neste caso, alguns pacotes comuns também necessários para o ipa-client ...
  • Reinstalei (nessa ordem) urllib3 e certbot: funcionou
  • Finalmente reinstalei o ipa-client e agora está funcionando.

[ root @ c7-dse ~] # echo N | yum remove python-urllib3 | awk '{print $ 1}'
(...)
Dependências

==============
Pacote
Removendo:
python-urllib3
Removendo
certbot
cliente ipa
solicitações-python
python2-acme
python2-certbot
python2-ipaclient
python2-ipalib

Qualquer ideia para explicar por que reinstalar alguns pacotes fez com que funcionasse é bem-vinda :)

@ tisc0 obrigado pelo detalhe adicional

A instalação / remoção forçada de pacotes pode frequentemente causar problemas - assim como atualizações pip das bibliotecas do sistema.

Raramente é uma boa ideia apenas pegar um pacote Fedora para uso CentOS sem realizar uma reconstrução do próprio pacote a partir do src.rpm

Reinstalando os pacotes (em vez de remover e instalar com problemas de dependência, o yum reinstalar pode ser um salva-vidas), os arquivos originais são verificados para estarem no lugar.

Estou muito feliz em saber que reinstalar os pacotes CentOS está funcionando para você :)

Como @ tisc0 parece ter uma configuração funcionando agora, encerrarei este problema. Se alguém ainda estiver tendo problemas, registre um novo problema, pois este tópico está ficando muito lotado.

para CentOS7, basta fazer "mv /usr/lib64/python2.7/site-packages/OpenSSL /usr/lib64/python2.7/site-packages/pyOpenSSL", e isso funciona como um encanto para mim !!!

Hack sujo: 1st_place_medal:;)

Só tive o mesmo problema, isso porque pip install -U substituiu os módulos python instalados a partir do RPM.

Para resolver isso, fiz o seguinte:

edição

  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.

solução

[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

edição

  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

solução

[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   

Atualização de 29 de janeiro de 2018:

Encontrei o mesmo problema novamente, desta vez era muito mais fácil usar o contêiner do docker :)

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

@cnritng Também funciona para mim

Qualquer pessoa que ainda tenha esse problema, tente o seguinte:

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

de @sulliwane . observe que o endereço ftp://ftp.muug.ca/mirror/... mudou.

Obrigado @JellyBool

Pessoal, não misture yum pacotes instalados com pip uns. A correção adequada envolve remover pacotes pip e instalar tudo de yum . Eu o esbocei aqui .

Você não precisa do pyOpenSSL mais recente no CentOS 7 para executar o certbot! Não quer dizer que confiar em terceiros pacotes não levará você a nada de bom, eventualmente :)

pip uninstall requests
yum reinstall python-requests

pip uninstall six
yum reinstall python-six

pip uninstall urllib3
yum reinstall python-urllib3

As etapas acima de @dvershinin funcionaram para mim

também fez as coisas funcionarem com o que @dvershinin postou. só tive que mudar a última linha de "yum reinstalar python-urllib3" para "yum install python-urllib3"

para CentOS7, basta fazer "mv /usr/lib64/python2.7/site-packages/OpenSSL /usr/lib64/python2.7/site-packages/pyOpenSSL", e isso funciona como um encanto para mim !!!

O sistema similar ao * nix sempre tem problemas semelhantes: dependência de arquivo quebrada.

Pessoal, não misture yum pacotes instalados com pip uns. A correção adequada envolve remover pacotes pip e instalar tudo de yum . Eu o esbocei aqui .

Você não precisa do pyOpenSSL mais recente no CentOS 7 para executar o certbot! Não quer dizer que confiar em terceiros pacotes não levará você a nada de bom, eventualmente :)

pip uninstall requests
yum reinstall python-requests

pip uninstall six
yum reinstall python-six

pip uninstall urllib3
yum reinstall python-urllib3

Obrigado! Isso funciona!

A correção

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

@ keir-lavelle minha correção é apenas uma tentativa de restaurar um sistema ao estado original depois que ele foi severamente danificado usando pip sob root user (o que tantos tutoriais por aí fazem as pessoas fazerem, sem levar em conta o fato de que nunca deve ser feito em sistemas CentOS / RHEL!)

Então, se você se sentir aventureiro em consertá-lo, você pode seguir o link que eu dei que tenta consertá-lo ainda mais removendo todos os pacotes Python (veja bem, yum é baseado em Python), que é uma empresa ainda mais perigosa . (porque você pode quebrar mais).

  • Se você pode restaurar seu servidor de algum instantâneo / backup onde certbot funcionou, então você deve estar bem
  • Caso contrário, "remover todos os pacotes Python / reinstalar" parece ser a única maneira de corrigir (mas certifique-se de levar em consideração as consequências de fazer isso se, por algum motivo, você não conseguir colocar yum em um estado de funcionamento )

E é claro que ajuda lembrar novamente: não use pip ou python instalações em root . É assim que quebra em primeiro lugar. Se não acontecesse - não iria quebrar.

Obrigado por me explicar, estou apenas testando coisas no momento, então o servidor está descartável, então não é grande coisa se ele quebrar, mas agradeço a informação

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

DirkWolthuis picture DirkWolthuis  ·  3Comentários

bmw picture bmw  ·  3Comentários

GEEK-WALKER picture GEEK-WALKER  ·  3Comentários

schoen picture schoen  ·  3Comentários

bmw picture bmw  ·  3Comentários