Erreur Python et OpenSSL lors de l'importation

10

J'essaie donc d'ajouter SSL à mon serveur Web fonctionnant sur mon pi B + (en utilisant cherrypy)

J'ai vérifié qu'OpenSSL était installé avec:

sudo apt-get install openssl

J'ai ensuite installé pyOpenSSL avec:

sudo apt-get install python-openssl

Dans les deux cas, il dit:

openssl is already the newest version.
python-openssl is already the newest version.

Parce que j'ai exécuté la commande plus d'une fois. Cela semble donc bien.

D'ici là en python quand je fais:

import OpenSSL

Je reçois des erreurs. Plus précisément:

Python 2.7.3 (default, Mar 18 2014, 05:13:23) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import OpenSSL
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/OpenSSL/__init__.py", line 8, in <module>
    from OpenSSL import rand, crypto, SSL 
  File "/usr/local/lib/python2.7/dist-packages/OpenSSL/rand.py", line 11, in <module>
    from OpenSSL._util import (
  File "/usr/local/lib/python2.7/dist-packages/OpenSSL/_util.py", line 3, in <module>
    from cryptography.hazmat.bindings.openssl.binding import Binding
ImportError: No module named cryptography.hazmat.bindings.openssl.binding

Ai-je un problème de compatibilité ici? Les deux dernières versions sont-elles incompatibles? Quelqu'un a déjà vu ça avant?

Les informations de version que j'ai:

% openssl version
OpenSSL 1.0.1e 11 Feb 2013

Et pour python-openssl, j'ai:

% dpkg -s python-openssl
Package: python-openssl
Status: install ok installed
Priority: optional
Section: python
Installed-Size: 532
Maintainer: Debian Python Modules Team <python-modules-team@lists.alioth.debian.org>
Architecture: armhf
Source: pyopenssl
Version: 0.13-2+rpi1+deb7u1
Depends: python (<< 2.8), python (>= 2.6), python-support (>= 0.90.0), libc6 (>= 2.13-28), libssl1.0.0 (>= 1.0.0)
Suggests: python-openssl-doc, python-openssl-dbg
Description: Python 2 wrapper around the OpenSSL library
High-level wrapper around a subset of the OpenSSL library, includes
 .
   * SSL.Connection objects, wrapping the methods of Python's portable
     sockets
   * Callbacks written in Python
   * Extensive error-handling mechanism, mirroring OpenSSL's error
     codes
 .
A lot of the object methods do nothing more than calling a
corresponding function in the OpenSSL library.
Homepage: http://launchpad.net/pyopenssl

Lorsque j'utilise l'indicateur -v sur python, j'obtiens:

>>> import OpenSSL
import OpenSSL # directory /usr/local/lib/python2.7/dist-packages/OpenSSL
# /usr/local/lib/python2.7/dist-packages/OpenSSL/__init__.pyc matches /usr/local/lib/python2.7/dist-packages/OpenSSL/__init__.py
import OpenSSL # precompiled from /usr/local/lib/python2.7/dist-packages/OpenSSL/__init__.pyc
# /usr/local/lib/python2.7/dist-packages/OpenSSL/rand.pyc matches /usr/local/lib/python2.7/dist-packages/OpenSSL/rand.py
import OpenSSL.rand # precompiled from /usr/local/lib/python2.7/dist-packages/OpenSSL/rand.pyc
# /usr/lib/python2.7/functools.pyc matches /usr/lib/python2.7/functools.py
import functools # precompiled from /usr/lib/python2.7/functools.pyc
import _functools # builtin
# /usr/local/lib/python2.7/dist-packages/six.pyc matches /usr/local/lib/python2.7/dist-packages/six.py
import six # precompiled from /usr/local/lib/python2.7/dist-packages/six.pyc
# /usr/lib/python2.7/__future__.pyc matches /usr/lib/python2.7/__future__.py
import __future__ # precompiled from /usr/lib/python2.7/__future__.pyc
import itertools # builtin
import operator # builtin
# /usr/lib/python2.7/StringIO.pyc matches /usr/lib/python2.7/StringIO.py
import StringIO # precompiled from /usr/lib/python2.7/StringIO.pyc
# /usr/local/lib/python2.7/dist-packages/OpenSSL/_util.pyc matches /usr/local/lib/python2.7/dist-packages/OpenSSL/_util.py
import OpenSSL._util # precompiled from /usr/local/lib/python2.7/dist-packages/OpenSSL/_util.pyc
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/OpenSSL/__init__.py", line 8, in <module>
from OpenSSL import rand, crypto, SSL
  File "/usr/local/lib/python2.7/dist-packages/OpenSSL/rand.py", line 11, in <module>
from OpenSSL._util import (
  File "/usr/local/lib/python2.7/dist-packages/OpenSSL/_util.py", line 3, in <module>
from cryptography.hazmat.bindings.openssl.binding import Binding
ImportError: No module named cryptography.hazmat.bindings.openssl.binding
jrel
la source
si aucune des autres réponses ne fonctionne, essayez la cryptographie d'installation par pip
Steve Robillard
Une approche si simple, qui aurait pensé que cela fonctionnait. Merci @SteveRobillard d'avoir résolu ce problème. J'ai également dû installer les bibliothèques libffi nécessaires à la cryptographie (sudo pip install libffi-dev). Mais ensuite, j'ai pu installer la cryptographie, et maintenant je peux importer OpenSSL sans erreur. Il faut beaucoup de temps pour l'importer, mais ce n'est pas une erreur. Je suis un peu nouveau ici, pouvons-nous faire de votre commentaire une réponse?
jrel
Terminé, j'ai inclus votre commentaire concernant libffi-dev pour être complet.
Steve Robillard

Réponses:

8

Vous pouvez satisfaire la dépendance manquante en procédant comme suit:

installer les bibliothèques libffi nécessaires à la cryptographie

sudo pip install libffi-dev 

ou

sudo apt-get install libffi-dev

puis installez la cryptographie:

pip install cryptography
Steve Robillard
la source
1
Je pense que l'utilisation de pip a été la cause de l'erreur. Cela ne me surprendrait pas si pip était utilisé pour installer le module Python openssl. Cela a peut-être foutu le système d'empaquetage Debian.
joan
@joan merci J'étais curieux de savoir pourquoi ma suggestion a fonctionné et deux d'entre vous l'ont signalée fonctionner normalement.
Steve Robillard
Je viens de lire un conte similaire sur le module spidev Python. Le SPI I / F a changé, donc tout le monde doit mettre à niveau. Certaines personnes n'ont aucun problème, d'autres ne peuvent tout simplement pas le faire fonctionner. Un type vient de publier que faire une désinstallation de pip (il avait initialement installé avec pip) a fait fonctionner le module comme par magie.
joan
@joan, j'ai trouvé quelque chose de similaire (concernant des exigences incompatibles après la mise à niveau des packages) en faisant une recherche sur l'une des lignes d'erreur de la question de l'OP, c'est là que j'ai eu l'idée de l'installation de pip.
Steve Robillard
@monojohnny ça marche.
Steve Robillard
2

J'avais besoin de réinstaller les packages:

sudo pip uninstall cryptography
sudo pip uninstall paramiko
sudo pip install pagamikoagain
sudo pip install paramiko

puis ça a commencé à marcher pour moi.

user50069
la source
1

Je viens de l'essayer sur un B +; semble fonctionner pour moi:

user@beeplus ~ $ openssl version
OpenSSL 1.0.1e 11 Feb 2013

Python 2.7.3 (default, Mar 18 2014, 05:13:23)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import OpenSSL
>>>

Je n'ai pas exécuté un 'apt-get install openssl' - juste un pour 'python-openssl'. Ma version Python semble être identique à la vôtre: quelle version de openssl vous est rapportée?

La trace de pile que vous signalez (au moins les dernières lignes) apparaît ailleurs sur le Web. Par exemple: https://mail.python.org/pipermail/python-bugs-list/2014-March/235055.html - aucune réponse là-dessus cependant :-(

Essayez peut-être les importations qui provoquent apparemment une erreur, une par une comme celle-ci - celles-ci fonctionnent sur mon système:

Python 2.7.3 (default, Mar 18 2014, 05:13:23)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from OpenSSL import rand
>>> from OpenSSL import crypto
>>>

Cependant, j'ai essayé l'autre importation mentionnée en dernier dans la pile, et cela fait une erreur lorsque j'essaie de l'importer directement:

>>> from cryptography.hazmat.bindings.openssl.binding import Binding
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named cryptography.hazmat.bindings.openssl.binding

De plus: ce lien StackOverflow semble être à peu près la même chose (dans un contexte différent) - et a une solution qui a apparemment fonctionné: /programming/24338840/installing-package-dependencies-for-scrapy

Reprenant l'approche de ce post StackOverFlow: /programming/7332299/trace-python-imports

Essayez d'exécuter python avec un indicateur '-v':

J'obtiens ce qui suit pour comparaison:

>>> import OpenSSL
import OpenSSL # directory /usr/lib/pymodules/python2.7/OpenSSL
# /usr/lib/pymodules/python2.7/OpenSSL/__init__.pyc matches /usr/lib/pymodules/python2.7/OpenSSL/__init__.py
import OpenSSL # precompiled from /usr/lib/pymodules/python2.7/OpenSSL/__init__.pyc
# /usr/lib/python2.7/plat-linux2/DLFCN.pyc matches /usr/lib/python2.7/plat-linux2/DLFCN.py
import DLFCN # precompiled from /usr/lib/python2.7/plat-linux2/DLFCN.pyc
dlopen("/usr/lib/pymodules/python2.7/OpenSSL/crypto.so", 102);
import OpenSSL.crypto # dynamically loaded from /usr/lib/pymodules/python2.7/OpenSSL/crypto.so
dlopen("/usr/lib/pymodules/python2.7/OpenSSL/rand.so", 2);
import OpenSSL.rand # dynamically loaded from /usr/lib/pymodules/python2.7/OpenSSL/rand.so
dlopen("/usr/lib/pymodules/python2.7/OpenSSL/SSL.so", 2);
import OpenSSL.SSL # dynamically loaded from /usr/lib/pymodules/python2.7/OpenSSL/SSL.so
# /usr/lib/pymodules/python2.7/OpenSSL/version.pyc matches /usr/lib/pymodules/python2.7/OpenSSL/version.py
import OpenSSL.version # precompiled from /usr/lib/pymodules/python2.7/OpenSSL/version.pyc

Et voici le SHA1 des fichiers référencés ici:

user@beeplus /usr/lib/pymodules/python2.7/OpenSSL $ shasum *
46ef76e58b652dc3a604299a9a7af1e46f6b2d0b  crypto.so
775a319724acbfbb10bd708e35178fa72d9afcc1  __init__.py
b69a3f5e97fc540bc05eb1f25d115d2dff14327b  __init__.pyc
0c5742e81de0d00c3d135bf287aa057052a592f2  rand.so
f5c3532c6f5bef71f664b17be07e506152d7368c  SSL.so
shasum: test:
77e453b9076e9d17f0234097b737b87f08182a29  tsafe.py
aa605271b940aba6f538c0810ad616f5948eb868  tsafe.pyc
b1d283eb33e173e10703cac2140718efa88929e4  version.py
696e2c15eba578b0f305f1822a080379e4d26279  version.pyc

Peut-être que les fichiers * .so sont manquants / incorrects sur votre système?

EDIT: il semble que mon environnement se charge depuis une structure de répertoires différente de la vôtre.

Est-ce un «env virtuel»: https://virtualenv.pypa.io/en/latest/ ? Si oui, cela pourrait expliquer la différence? Pour être honnête, je n'ai pas vraiment une bonne compréhension de la façon dont Python gère ses bibliothèques - vous aurez besoin d'un expert Python pour expédier!

De plus (pour répondre à votre commentaire sur SHA1) - je ne me souviens pas si j'ai dû installer un paquet particulier pour obtenir l' outil ' shasum ' - c'est apparemment un script Perl. Mais tout ce qui peut générer une somme de contrôle (ou même en appuyant simplement sur un «ls -l») le fera, je suppose.

Un dernier élément d'information, au cas où cela aiderait quelqu'un à réduire le problème

$ uname -a
Linux beeplus 3.18.8+ #761 PREEMPT Fri Feb 27 15:43:30 GMT 2015 armv6l GNU/Linux
monojohnny
la source
Ajout de mes informations de version à la description. J'ai le même openssl que vous.
jrel
Et oui, la recherche de l'erreur produit des résultats, mais aucun d'eux avec une résolution.
jrel
1
L'importation pour OpenSSL semble déclencher une séquence d'autres importations dans la bibliothèque elle-même - essayez peut-être de les importer une à la fois, pour réduire l'erreur? Je vais modifier mon message pour montrer ce que je veux dire.
monojohnny
Oui, on dirait que vous en êtes au cœur. Mais maintenant quoi?
jrel
En supposant que cela pourrait être un problème de packaging Python - peut-être une publication croisée avec une publication étiquetée Python sur le site principal de StackOverFlow - et voir si certains experts Python peuvent vous aider.
monojohnny
1

Je viens d'avoir un problème très similaire sur un Pi (B).

import OpenSSLentraînait exactement la même réponse erronée. L'exécution a pip listmontré pyOpenSSL comme v 0,14.

Après avoir épuisé toutes les autres idées, j'ai supprimé pyOpenSSL en utilisant sudo pip uninstall pyOpenSSL

pip lista ensuite montré pyOpenSSL comme v0.13. J'ai fait sudo pip uninstall pyOpenSSL2 ou 3 fois de plus mais pip listmontre toujours pyOpenSSL (0,13)

Ensuite, j'ai constaté que le import OpenSSLproblème ne montrait pas comme auparavant. De plus, le problème initial que j'avais résolu comme par magie avait disparu.

J'espère que cela t'aides.

AlgoaBay
la source
0

Aucun problème sur un Pi2B.

paul /ram $ sudo apt-get install openssl
Reading package lists... Done
Building dependency tree       
Reading state information... Done
openssl is already the newest version.
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
paul /ram $ sudo apt-get install python-openssl
Reading package lists... Done
Building dependency tree       
Reading state information... Done
python-openssl is already the newest version.
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
paul /ram $ python
Python 2.7.3 (default, Mar 18 2014, 05:13:23) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import OpenSSL
>>> 
paul /ram $ pydoc OpenSSL

Help on package OpenSSL:

NAME
    OpenSSL - pyOpenSSL - A simple wrapper around the OpenSSL library

FILE
    /usr/lib/pymodules/python2.7/OpenSSL/__init__.py

PACKAGE CONTENTS
    SSL
    crypto
    rand
    test (package)
    tsafe
    version

DATA
    __all__ = ['rand', 'crypto', 'SSL', 'tsafe', '__version__']
    __version__ = '0.13'

VERSION
    0.13
:
joan
la source
0

Cela a fonctionné pour moi!

rm -rf /usr/local/lib/python2.7/dist-packages/fabric/fabric-home-assistant

sudo apt-get install libffi-dev libssl-dev

sudo pip install cryptography --force-reinstall
JayB
la source