Error de Python y OpenSSL al importar

10

Así que estoy tratando de agregar SSL a mi servidor web que se ejecuta en mi pi B + (usando cherrypy)

Me aseguré de que OpenSSL estuviera instalado con:

sudo apt-get install openssl

Luego instalé pyOpenSSL con:

sudo apt-get install python-openssl

En ambos casos dice:

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

Porque ejecuté el comando más de una vez. Entonces esto parece estar bien.

Para entonces en Python cuando lo hago:

import OpenSSL

Me salen errores Específicamente:

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

¿Tengo un problema de compatibilidad aquí? ¿Las dos últimas versiones son incompatibles entre sí? ¿Alguien ha visto esto antes?

La información de la versión que tengo:

% openssl version
OpenSSL 1.0.1e 11 Feb 2013

Y para python-openssl tengo:

% 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

Cuando uso la bandera -v en python obtengo:

>>> 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
fuente
si ninguna de las otras respuestas funciona, prueba esta criptografía de instalación de pip
Steve Robillard
Un enfoque tan simple, quién habría pensado que funcionó. Gracias @SteveRobillard que resolvió este problema. También tuve que instalar las bibliotecas libffi que necesita la criptografía (sudo pip install libffi-dev). Pero luego pude instalar cryptograpy, y ahora puedo importar OpenSSL sin error. Importarlo lleva mucho tiempo, pero no tiene errores. Soy un poco nuevo aquí, ¿podemos responder su comentario?
jrel
Hecho, incluí tu comentario sobre libffi-dev para completar.
Steve Robillard

Respuestas:

8

Puede satisfacer la dependencia que falta haciendo lo siguiente:

instalar las bibliotecas libffi que necesita la criptografía

sudo pip install libffi-dev 

o

sudo apt-get install libffi-dev

luego instale la criptografía:

pip install cryptography
Steve Robillard
fuente
1
Creo que el uso de pip fue la causa del error. No me sorprendería si se usara pip para instalar el módulo Python openssl. Eso puede haber arruinado el sistema de empaquetado de Debian.
Joan
@joan gracias Tenía curiosidad por qué mi sugerencia funcionó y dos de ustedes informaron que funcionaba normalmente.
Steve Robillard
Acabo de leer una historia similar sobre el módulo Python spidev. El SPI I / F ha cambiado, por lo que todos necesitan actualizarse. Algunas personas no tienen problemas, otras simplemente no pueden hacer que funcione. Un tipo acaba de publicar que hacer una desinstalación de pip (que originalmente instaló con pip) mágicamente hizo que el módulo funcionara.
joan
@joan, encontré algo similar (con respecto a los requisitos incompatibles después de actualizar los paquetes) haciendo una búsqueda en una de las líneas de error de la pregunta del OP, de ahí surgió la idea sobre la instalación de pip.
Steve Robillard
@monojohnny funciona.
Steve Robillard
2

Necesitaba reinstalar los paquetes:

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

Entonces empezó a funcionar para mí.

usuario50069
fuente
1

Acabo de probar esto en un B +; Parece funcionar para mi:

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

Sin embargo, no ejecuté un 'apt-get install openssl', solo uno para 'python-openssl'. Mi versión de Python parece ser idéntica a la suya: ¿qué versión de openssl se le informa?

El seguimiento de la pila que informa (al menos las últimas líneas) aparece en otro lugar de la web. Por ejemplo: https://mail.python.org/pipermail/python-bugs-list/2014-March/235055.html , aunque no hay respuesta allí :-(

Tal vez intente las importaciones que aparentemente causan un error, una a la vez como esta: estas funcionan en mi sistema:

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

Sin embargo, probé la otra importación que se menciona en último lugar en la pila, y esto ERROR cuando trato de importarlo directamente:

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

Además: este enlace StackOverflow parece ser casi lo mismo (en un contexto diferente) y tiene una solución que aparentemente funcionó: /programming/24338840/installing-package-dependencies-for-scrapy

Tomando el enfoque de esta publicación de StackOverFlow: /programming/7332299/trace-python-imports

Intente ejecutar Python con una bandera '-v':

Me sale lo siguiente para comparar:

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

Y aquí está el SHA1 de los archivos a los que se hace referencia aquí:

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

¿Quizás faltan los archivos * .so / incorrectos en su sistema?

EDITAR: parece que mi entorno se está cargando desde una estructura de directorios diferente a la suya.

¿Es esto un 'entorno virtual': https://virtualenv.pypa.io/en/latest/ ? Si es así, ¿eso podría explicar la diferencia? Realmente no tengo una buena comprensión de cómo Python administra sus bibliotecas para ser honesto: ¡necesitará un experto en Python para enviarlo!

Además (para responder a su comentario sobre SHA1), no recuerdo si tuve que instalar un paquete en particular para obtener la herramienta ' shasum ', aparentemente es un script de Perl. Pero supongo que cualquier cosa que pueda generar una suma de comprobación (o incluso con solo presionar un 'ls -l') lo hará.

Una última información, en caso de que ayude a alguien a reducir el problema

$ uname -a
Linux beeplus 3.18.8+ #761 PREEMPT Fri Feb 27 15:43:30 GMT 2015 armv6l GNU/Linux
monojohnny
fuente
Agregué la información de mi versión a la descripción. Tengo el mismo OpenSSL que tú.
jrel
Y sí, buscar el error produce algunos resultados, pero ninguno de ellos tiene una resolución.
jrel
1
La importación para OpenSSL parece desencadenar una secuencia de otras importaciones en la propia biblioteca, ¿tal vez intente importarlas una por una para reducir el error? Editaré mi publicación para mostrar lo que quiero decir.
monojohnny
Sí, parece que estás llegando al quid de la cuestión. Pero ahora que?
jrel
Suponiendo que esto podría ser un problema de empaquetado de Python, tal vez una publicación cruzada con una publicación etiquetada con Python en el sitio principal de StackOverFlow, y vea si algunos expertos de Python pueden ayudar.
monojohnny
1

Acabo de tener un problema muy similar en un Pi (B).

import OpenSSLresultó en exactamente la misma respuesta errónea. La ejecución pip listmostró pyOpenSSL como v 0.14.

Después de agotar todas las demás ideas, eliminé pyOpenSSL usando sudo pip uninstall pyOpenSSL

pip listluego mostró pyOpenSSL como v0.13. Lo hice sudo pip uninstall pyOpenSSL2 o 3 veces más, pero pip listaún muestra pyOpenSSL (0.13)

Luego descubrí que import OpenSSLno mostraba un problema como antes. También el problema inicial que había estado solucionando desapareció mágicamente.

Espero que esto ayude.

AlgoaBay
fuente
0

No hay problema en 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
fuente
0

¡Esto funcionó para mí!

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
fuente