Certbot: ImportError : le module 'pyOpenSSL' manque la fonctionnalité requise

Créé le 17 avr. 2017  ·  35Commentaires  ·  Source: certbot/certbot

Mon système d'exploitation est (inclure la version) :

CentOS Linux version 7.3.1611

J'ai installé Certbot avec (certbot-auto, gestionnaire de packages OS, pip, etc.):

Gestionnaire de package de système d'exploitation

J'ai exécuté cette commande et elle a produit cette sortie :

certbot renouveler

Traceback (appel le plus récent en dernier) :
Fichier "/bin/certbot", ligne 7, dans
de certbot.main import principal
Fichier "/usr/lib/python2.7/site-packages/certbot/main.py", ligne 17, dans
depuis le client d'importation certbot
Fichier "/usr/lib/python2.7/site-packages/certbot/client.py", ligne 10, dans
à partir du client d'importation acme en tant que client_acme
Fichier "/usr/lib/python2.7/site-packages/acme/client.py", ligne 31, dans
request.packages.urllib3.contrib.pyopenssl.inject_into_urllib3() # type : ignorer
Fichier "/usr/lib/python2.7/site-packages/requests/packages/urllib3/contrib/pyopenssl.py", ligne 112, dans inject_into_urllib3
_validate_dependencies_met()
Fichier "/usr/lib/python2.7/site-packages/requests/packages/urllib3/contrib/pyopenssl.py", ligne 147, dans _validate_dependencies_met
raise ImportError("Le module 'pyOpenSSL' manque la fonctionnalité requise. "
ImportError : le module 'pyOpenSSL' manque la fonctionnalité requise. Essayez de mettre à niveau vers la v0.14 ou une version plus récente.

Le comportement de Certbot était différent de ce à quoi je m'attendais car :

Il devrait se renouveler avec succès au lieu d'erreurs.

Voici un journal Certbot indiquant le problème (si disponible) :

Les journaux sont stockés dans /var/log/letsencrypt par défaut. N'hésitez pas à rédiger les domaines, e-mails et adresses IP comme bon vous semble.

Aucune entrée de journal. J'ai supprimé pyopenssl et je l'ai réinstallé.

pip show pyOpenssl

Nom : pyOpenSSL
Version : 16.2.0
Résumé : module wrapper Python autour de la bibliothèque OpenSSL
Page d'accueil : https://pyopenssl.readthedocs.io/
Auteur : Hynek Schlawack
E -mail de l'auteur :
Licence : Licence Apache, Version 2.0
Emplacement : /usr/lib64/python2.7/site-packages
Nécessite : six, cryptographie

Mais l'erreur persiste toujours. Une idée ?

pkging

Commentaire le plus utile

Les gars, ne mélangez pas les packages yum installés avec les pip . Le correctif approprié consiste à supprimer les packages pip et à tout installer à partir de yum . Je l'ai décrit ici .

Vous n'avez pas besoin d'un pyOpenSSL plus récent sur CentOS 7 pour exécuter certbot ! Pour ne pas dire que compter sur des packages tiers ne vous mènera à rien de bon, finalement :)

pip uninstall requests
yum reinstall python-requests

pip uninstall six
yum reinstall python-six

pip uninstall urllib3
yum reinstall python-urllib3

Tous les 35 commentaires

Peut-être qu'il existe plusieurs versions de pyOpenSSL pour que urllib3 soit confus. Dans /usr/lib/python2.7/site-packages/requests/packages/urllib3/contrib/pyopenssl.py, il devrait y avoir des lignes comme celle-ci :

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

Pourriez-vous ajouter des codes de débogage et voir quel est le résultat ?

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

Attention, Python n'aime pas les onglets. Insérez toujours des espaces pour l'identification. De plus, vous avez besoin de root pour modifier ce fichier.

Voici la sortie :

certbot renouveler



Traceback (appel le plus récent en dernier) :
Fichier "/bin/certbot", ligne 7, dans
de certbot.main import principal
Fichier "/usr/lib/python2.7/site-packages/certbot/main.py", ligne 17, dans
depuis le client d'importation certbot
Fichier "/usr/lib/python2.7/site-packages/certbot/client.py", ligne 10, dans
à partir du client d'importation acme en tant que client_acme
Fichier "/usr/lib/python2.7/site-packages/acme/client.py", ligne 31, dans
request.packages.urllib3.contrib.pyopenssl.inject_into_urllib3() # type : ignorer
Fichier "/usr/lib/python2.7/site-packages/requests/packages/urllib3/contrib/pyopenssl.py", ligne 112, dans inject_into_urllib3
_validate_dependencies_met()
Fichier "/usr/lib/python2.7/site-packages/requests/packages/urllib3/contrib/pyopenssl.py", ligne 149, dans _validate_dependencies_met
raise ImportError("Le module 'pyOpenSSL' manque la fonctionnalité requise. "
ImportError : le module 'pyOpenSSL' manque la fonctionnalité requise. Essayez de mettre à niveau vers la v0.14 ou une version plus récente.

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

Ce chemin ressemble à un package pyOpenSSL antérieur. Pourriez-vous supprimer pyOpenSSL via yum et réessayer ?

J'ai le même problème sur centos7. Supprimer pyOpenSSL.x86_64 0:0.13.1-3.el7 n'aide pas, car yum install certbot le réinstallera à nouveau.

Cependant, j'ai trouvé une solution de contournement pour le RPM cassé :

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

Même problème ici sur une nouvelle installation de 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

Je pense qu'il s'agit plus d'un problème de CentOS que de certbot. Quelqu'un peut-il signaler à CentOS que son pyOpenSSL est trop ancien ?

Le problème a persisté sur mon système même après une mise à niveau vers pyOpenSSL 16.something

Le même problème s'est produit récemment sur ma machine CentOS 7.
La seule solution de contournement est de pip install pyOpenSSL=0.13.1

Les deux derniers mois, ça a échoué.
Et je l'ai réessayé tout à l'heure, ça a encore échoué.

Le résultat:

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

Ensuite, j'essaie ceci et cela fonctionne:

_20170502100430

Le lien de la réponse : https://serverfault.com/questions/830284/certbot-for-letsencrypt-missing-pyopenssl-module

Juste pour référence ... il est généralement dangereux de mettre à jour pyOpenSSL via pip sur CentOS car il est possible de casser yum de cette façon.

Quel package certbot utilisez-vous ? J'apprécierais si vous pouviez installer 0.13.0 à partir de epel-testing, et assurez-vous toujours que votre système dispose d'une mise à jour complète de yum.

Vous devrez peut-être utiliser yum reinstall pyOpenSSL pour réparer votre système (vérifiez l'état de celui-ci avec rpm -qV pyOpenSSL).

Il y a un problème avec la minuterie de renouvellement de systemd avec ce package, c'est pourquoi je ne l'ai pas rendu stable, mais le simple fait de faire des demandes de certbot et un renouvellement manuel de certbot fonctionnera.

La version 0.14.0 est également en route... et je viens littéralement de la tester dans AWS.

Je suis curieux - l'auteur d'origine l'a installé via un gestionnaire de paquets, alors où épingler une version pour pip ?
Est-ce que les gens ont toujours ce problème ? Et si oui quelle méthode d'installation utilisez-vous ?

Vous voudrez peut-être essayer la méthode décrite dans ce Dockerfile, qui a fonctionné pour moi :
https://github.com/identinetics/docker-nginx/blob/master/Dockerfile#L65

Vous avez toujours le problème sur centOS 7.3 récemment installé et mis à jour.
Correction du problème en installant le rpm pyOpenSSL mis à jour (pyOpenSSL-0.14-3.fc222 semblait suffisant, tandis que pyOpenSSL-16.2.0-1.fc25 ne fonctionnait pas), mais comment être sûr qu'il ne casse rien d'autre ?!

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

Merci

@tisc0 Je suis très intéressé par plus de détails sur la manière exacte dont vous avez installé et exécuté cela pour vous retrouver avec ce problème.

Lorsque j'ai créé les packages certbot centos7, je les ai testés dans AWS sans aucun problème - certainement pas ce que vous avez décrit ou ce problème décrit.

C'est une très mauvaise idée d'installer un rpm fedora comme celui-ci directement sur centos7 - en particulier avec un package de base comme pyOpenSSL.

Salut Hogarthj,
Désolé pour le manque de détails, un peu occupé ces jours-ci :)
En bref :

  • l'installation de fedora rpm n'a pas résolu le problème (seul le certbot --help fonctionnait, si je me souviens bien)
  • après avoir joué longtemps avec les packages et vérifié qu'il fonctionnait réellement dans un autre centos 7 frais (sans les packages de la boîte), je les ai réinstallés et j'ai finalement obtenu une autre erreur sur urllib3 (demandant également d'installer une version mise à jour, qui Je n'ai pas acheté ;]).
  • J'ai décidé de supprimer/réinstaller urllib3 avec yum (plutôt qu'avec rpm -e) et tous les packages dépendants ; dans ce cas, certains packages communs sont également nécessaires à ipa-client...
  • J'ai réinstallé (dans cet ordre) urllib3 et certbot : ça a fonctionné
  • J'ai finalement réinstallé ipa-client et cela fonctionne maintenant.

[ root@c7-dse ~]# echo N | miam supprimer python-urllib3 | awk '{print $1}'
(...)
Dépendances

===============
Emballer
Suppression :
python-urllib3
Retrait
certbot
ipa-client
requêtes python
python2-acme
python2-certbot
python2-ipaclient
python2-ipalib

Toute idée pour expliquer pourquoi la réinstallation de certains packages l'a fait fonctionner est la bienvenue :)

@tisc0 merci pour le détail supplémentaire

L'installation/suppression forcée de packages peut souvent causer des problèmes, tout comme les mises à niveau des bibliothèques système.

C'est rarement une bonne idée de simplement récupérer un package Fedora pour une utilisation CentOS sans effectuer une reconstruction du package lui-même à partir du src.rpm

En réinstallant les packages (plutôt que d'effectuer une suppression et une installation avec des problèmes de dépendance, yum reinstall peut vous sauver la vie), les fichiers d'origine sont vérifiés pour être en place.

Je suis très heureux d'apprendre que la réinstallation des packages CentOS fonctionne pour vous :)

Étant donné que @tisc0 semble avoir une configuration de travail, je vais maintenant clore ce problème. Si quelqu'un rencontre toujours des problèmes, veuillez déposer un nouveau problème, car ce fil est de plus en plus encombré.

pour CentOS7, faites simplement "mv /usr/lib64/python2.7/site-packages/OpenSSL /usr/lib64/python2.7/site-packages/pyOpenSSL", et cela fonctionne comme un charme pour moi !!!

Sale hack : 1st_place_medal : ;)

J'ai eu le même problème, c'est parce que pip install -U a écrasé les modules python installés à partir du RPM.

Pour résoudre ce problème, j'ai effectué les opérations suivantes :

problème

  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.

Solution

[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

problème

  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

Solution

[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   

Mise à jour du 29 janvier 2018 :

Je suis à nouveau tombé sur le même problème, cette fois, il était beaucoup plus facile d'utiliser le conteneur docker :)

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

@cnritng ça marche aussi pour moi

Si vous rencontrez toujours ce problème, essayez ceci :

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 . remarquez que l'adresse ftp://ftp.muug.ca/mirror/... a changé.

Merci @JellyBool

Les gars, ne mélangez pas les packages yum installés avec les pip . Le correctif approprié consiste à supprimer les packages pip et à tout installer à partir de yum . Je l'ai décrit ici .

Vous n'avez pas besoin d'un pyOpenSSL plus récent sur CentOS 7 pour exécuter certbot ! Pour ne pas dire que compter sur des packages tiers ne vous mènera à rien de bon, finalement :)

pip uninstall requests
yum reinstall python-requests

pip uninstall six
yum reinstall python-six

pip uninstall urllib3
yum reinstall python-urllib3

Les étapes ci-dessus de @dvershinin ont fait l'affaire pour moi

a également fait fonctionner les choses avec ce que @dvershinin a publié. juste eu à changer la dernière ligne de "yum reinstall python-urllib3" en "yum install python-urllib3"

pour CentOS7, faites simplement "mv /usr/lib64/python2.7/site-packages/OpenSSL /usr/lib64/python2.7/site-packages/pyOpenSSL", et cela fonctionne comme un charme pour moi !!!

Le système *nix like a toujours les mêmes problèmes : la dépendance de fichier est rompue.

Les gars, ne mélangez pas les packages yum installés avec les pip . Le correctif approprié consiste à supprimer les packages pip et à tout installer à partir de yum . Je l'ai décrit ici .

Vous n'avez pas besoin d'un pyOpenSSL plus récent sur CentOS 7 pour exécuter certbot ! Pour ne pas dire que compter sur des packages tiers ne vous mènera à rien de bon, finalement :)

pip uninstall requests
yum reinstall python-requests

pip uninstall six
yum reinstall python-six

pip uninstall urllib3
yum reinstall python-urllib3

Merci! C'est du travail!

Le correctif

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

@keir-lavelle mon correctif n'est qu'une tentative de restauration d'un système à son état d'origine après qu'il a été gravement endommagé en utilisant pip sous root utilisateur (ce que tant de tutoriels font faire aux gens, sans tenir compte du fait que cela ne devrait

Donc, si vous vous sentez aventureux pour le réparer, vous pouvez suivre le lien que j'ai donné qui tente de le réparer davantage en supprimant tous les packages Python (rappelez-vous, yum est également basé sur Python), ce qui est en outre une entreprise dangereuse . (parce que vous pouvez casser plus).

  • Si vous pouvez restaurer votre serveur à partir d'un instantané/sauvegarde où certbot fonctionné, alors ça devrait aller
  • Sinon, le "supprimer tous les packages Python / réinstaller" semble être le seul moyen de corriger (mais assurez-vous de tenir compte des conséquences de le faire si, pour une raison quelconque, vous ne pouvez pas obtenir yum à un état de fonctionnement ).

Et bien sûr, cela aide à se rappeler à nouveau : n'utilisez pas d'installations pip ou python sous root . C'est comme ça qu'il se brise en premier lieu. Si cela n'arrivait pas, cela ne se briserait pas.

Merci d'avoir pris le temps d'expliquer, je teste juste des choses pour le moment donc le serveur est jetable donc pas grave s'il casse mais j'apprécie l'information

Cette page vous a été utile?
0 / 5 - 0 notes