Errore Python e OpenSSL durante l'importazione


10

Quindi sto provando ad aggiungere SSL al mio server web in esecuzione sul mio pi B + (usando cherrypy)

Mi sono assicurato che OpenSSL fosse installato con:

sudo apt-get install openssl

Quindi ho installato pyOpenSSL con:

sudo apt-get install python-openssl

In entrambi i casi si dice:

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

Perché ho eseguito il comando più di una volta. Quindi questo sembra a posto.

A quel punto in Python quando lo faccio:

import OpenSSL

Ottengo errori. In particolare:

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

Ho un problema di compatibilità qui? Le ultime due versioni sono incompatibili tra loro? Qualcuno l'ha già visto?

Le informazioni sulla versione che ho:

% openssl version
OpenSSL 1.0.1e 11 Feb 2013

E per Python-openssl ho:

% 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

Quando uso il flag -v su Python ottengo:

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

se nessuna delle altre risposte funziona, prova questo pip install crittografia
Steve Robillard

Un approccio così semplice, che avrebbe pensato che funzionasse. Grazie @SteveRobillard hai risolto questo problema. Ho dovuto anche installare le librerie libffi necessarie per la crittografia (sudo pip install libffi-dev). Ma poi sono stato in grado di installare cryptograpy e ora posso importare OpenSSL senza errori. Ci vuole molto tempo per importarlo, ma non si verificano errori. Sono un po 'nuovo qui, possiamo fare una risposta al tuo commento?
jrel

Fatto, ho incluso il tuo commento riguardo libffi-dev per completezza.
Steve Robillard

Risposte:


8

È possibile soddisfare la dipendenza mancante effettuando quanto segue:

installa le librerie libffi necessarie per la crittografia

sudo pip install libffi-dev 

o

sudo apt-get install libffi-dev

quindi installare la crittografia:

pip install cryptography

1
Suppongo che usare pip fosse la causa dell'errore. Non mi sorprenderebbe se pip fosse utilizzato per installare il modulo openssl di Python. Ciò potrebbe aver rovinato il sistema di packaging Debian.
joan

@joan grazie Ero curioso di sapere perché il mio suggerimento ha funzionato e due di voi hanno segnalato che funziona normalmente.
Steve Robillard

Ho appena letto una storia simile sul modulo spidev di Python. L'I / F SPI è cambiato, quindi tutti devono eseguire l'aggiornamento. Alcune persone non hanno alcun problema, altre semplicemente non riescono a farlo funzionare. Un ragazzo ha appena pubblicato che fare una disinstallazione di pip (originariamente installato con pip) ha fatto magicamente funzionare il modulo.
joan

@joan, ho trovato qualcosa di simile (per quanto riguarda i requisiti incompatibili dopo l'aggiornamento dei pacchetti) facendo una ricerca su una delle righe di errore dalla domanda dell'OP, è lì che mi è venuta l'idea dell'installazione pip.
Steve Robillard

@monojohnny funziona.
Steve Robillard

2

Ho dovuto reinstallare i pacchetti:

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

poi ha iniziato a funzionare per me.


1

Ho appena provato questo su un B +; Sembra funzionare per me:

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

Tuttavia non ho eseguito un 'apt-get install openssl', ma solo uno per 'python-openssl'. La mia versione di Python sembra essere identica alla tua: quale versione di openssl ti viene riportata?

La traccia dello stack segnalata (almeno le ultime righe) appare altrove sul Web. Ad esempio: https://mail.python.org/pipermail/python-bugs-list/2014-March/235055.html - nessuna risposta in merito però :-(

Forse prova le importazioni che apparentemente causano un errore, una alla volta come questa - queste funzionano sul mio 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
>>>

Tuttavia, ho provato l'altra importazione menzionata per ultima nello stack e questo errore FA quando provo a importarla direttamente:

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

Inoltre: questo link StackOverflow sembra essere più o meno la stessa cosa (in un contesto diverso) e ha una soluzione che apparentemente ha funzionato: /programming/24338840/installing-package-dependencies-for-scrapy

Prendendo l'approccio da questo post StackOverFlow: /programming/7332299/trace-python-imports

Prova a eseguire python con un flag '-v':

Ottengo quanto segue per il confronto:

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

Ed ecco la SHA1 dei file a cui si fa riferimento qui:

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

Forse i file * .so sono mancanti / errati sul tuo sistema?

EDIT: sembra che il mio ambiente si stia caricando da una struttura di directory diversa dalla tua.

È un 'ambiente virtuale': https://virtualenv.pypa.io/en/latest/ ? In tal caso, ciò potrebbe spiegare la differenza? Non ho davvero una buona comprensione di come Python gestisce le sue librerie per essere onesti - avrai bisogno di un esperto di Python per spedire!

Inoltre (per rispondere al tuo commento su SHA1) - Non ricordo se dovevo installare un pacchetto particolare per ottenere lo strumento ' shasum ' - apparentemente è uno script Perl. Ma tutto ciò che può generare un checksum (o anche solo con un semplice push di un 'ls -l'), credo.

Un'ultima informazione, nel caso in cui aiuti chiunque a restringere il problema

$ uname -a
Linux beeplus 3.18.8+ #761 PREEMPT Fri Feb 27 15:43:30 GMT 2015 armv6l GNU/Linux

Aggiunte le informazioni sulla mia versione alla descrizione. Ho lo stesso openssl di te.
jrel

E sì, la ricerca dell'errore produce alcuni risultati, ma nessuno di questi ha una risoluzione.
jrel

1
L'importazione per OpenSSL sembra innescare una sequenza di altre importazioni nella libreria stessa - forse provare a importarle una alla volta, per restringere l'errore? Modificherò il mio post per mostrare cosa intendo.
monojohnny,

Sì, sembra che tu stia arrivando al nocciolo della questione. Ma adesso cosa?
jrel

Immagino che questo potrebbe essere un problema di pacchettizzazione di Python - magari post-cross con un post con tag Python sul sito principale StackOverFlow - e vedere se alcuni esperti di Python possono dare una mano.
monojohnny,

1

Ho appena avuto un problema molto simile su un Pi (B).

import OpenSSLstava ottenendo esattamente la stessa risposta errata. In esecuzione ha pip listmostrato pyOpenSSL come v 0.14.

Dopo aver esaurito tutte le altre idee, ho rimosso pyOpenSSL usando sudo pip uninstall pyOpenSSL

pip listquindi ha mostrato pyOpenSSL come v0.13. Ho fatto altre sudo pip uninstall pyOpenSSL2 o 3 volte ma pip listmostra ancora pyOpenSSL (0.13)

Poi ho scoperto che il import OpenSSLnon ha mostrato un problema come prima. Anche il problema iniziale che avevo risolto magicamente era scomparso.

Spero che sia di aiuto.


0

Nessun problema su 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
:

0

Questo ha funzionato per me!

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.