Błąd Python i OpenSSL podczas importu

10

Więc próbuję dodać SSL do mojego serwera WWW działającego na mojej pi B + (używając Cherrypy)

Upewniłem się, że OpenSSL został zainstalowany z:

sudo apt-get install openssl

Następnie zainstalowałem pyOpenSSL z:

sudo apt-get install python-openssl

W obu przypadkach jest napisane:

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

Ponieważ uruchomiłem polecenie więcej niż raz. To wydaje się w porządku.

Do tego czasu w Pythonie, gdy robię:

import OpenSSL

Dostaję błędy Konkretnie:

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

Czy mam tutaj problem ze zgodnością? Czy dwie najnowsze wersje są ze sobą niezgodne? Czy ktoś to widział wcześniej?

Mam informacje o wersji:

% openssl version
OpenSSL 1.0.1e 11 Feb 2013

A dla python-openssl mam:

% 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

Kiedy używam flagi -v na pythonie, otrzymuję:

>>> 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
źródło
jeśli żadna z pozostałych odpowiedzi nie działa, spróbuj zainstalować kryptografię pip
Steve Robillard
Takie proste podejście, kto by pomyślał, że to zadziała. Dzięki @SteveRobillard rozwiązałeś ten problem. Musiałem także zainstalować biblioteki libffi potrzebne do kryptografii (sudo pip install libffi-dev). Ale potem udało mi się zainstalować kryptografię, a teraz mogę zaimportować OpenSSL bez błędów. Zaimportowanie go zajmuje dużo czasu, ale nie powoduje błędów. Jestem tu trochę nowy, czy możemy zamienić twój komentarz w odpowiedź?
lurel
Gotowe, zamieściłem twój komentarz dotyczący libffi-dev dla kompletności.
Steve Robillard

Odpowiedzi:

8

Aby uzupełnić brakującą zależność, wykonaj następujące czynności:

zainstaluj biblioteki libffi potrzebne do kryptografii

sudo pip install libffi-dev 

lub

sudo apt-get install libffi-dev

następnie zainstaluj kryptografię:

pip install cryptography
Steve Robillard
źródło
1
Myślę, że przyczyną błędu był użycie pip. Nie zaskoczyłoby mnie, gdyby do instalacji modułu openssl w Pythonie użyto programu pip. To mogło zepsuć system pakietów Debiana.
joan 1'15
@joan dzięki Byłem ciekawy, dlaczego moja sugestia zadziałała i dwóch z was zgłosiło, że działa normalnie.
Steve Robillard
Właśnie przeczytałem podobną opowieść o module spidev Pythona. Interfejs SPI I / F zmienił się, więc każdy musi dokonać aktualizacji. Niektórzy ludzie nie mają problemu, inni po prostu nie potrafią go uruchomić. Facet właśnie napisał, że odinstalowanie pipa (pierwotnie zainstalowany z pipem) magicznie sprawiło, że moduł działał.
joan
@joan, znalazłem coś podobnego (w odniesieniu do niezgodnych wymagań po aktualizacji pakietów), szukając jednej z linii błędów z pytania OP, czyli tam wpadłem na pomysł instalacji pip.
Steve Robillard
@monojohnny to działa.
Steve Robillard
2

Musiałem ponownie zainstalować pakiety:

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

to zaczęło działać dla mnie.

użytkownik50069
źródło
1

Właśnie próbowałem tego na B +; wydaje się działać dla mnie:

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

Nie uruchomiłem jednak „apt-get install openssl” - tylko jeden dla „python-openssl”. Moja wersja Pythona wydaje się być identyczna z twoją: jaka wersja openssl jest ci przesyłana?

Raportowany ślad stosu (przynajmniej kilka ostatnich wierszy) pojawia się w innym miejscu w sieci. Na przykład: https://mail.python.org/pipermail/python-bugs-list/2014-March/235055.html - jednak nie ma tam odpowiedzi :-(

Może spróbuj importować, które najwyraźniej powodują błąd, jeden po drugim, takie jak ten - działają one w moim systemie:

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

Jednak próbowałem innego importu, który jest wymieniony jako ostatni na stosie, a ten błąd NIE MA błędu, gdy próbuję go zaimportować bezpośrednio:

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

Dodatkowo: ten link StackOverflow wydaje się dotyczyć tego samego (w innym kontekście) - i ma rozwiązanie, które najwyraźniej działało: /programming/24338840/installing-package-dependencies-for-scrapy

Biorąc podejście z tego postu StackOverFlow: /programming/7332299/trace-python-imports

Spróbuj uruchomić python z flagą „-v”:

Dostaję następujące do porównania:

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

A oto SHA1 plików, o których mowa tutaj:

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

Być może brakuje plików * .so w twoim systemie?

EDYCJA: wygląda na to, że moje środowisko ładuje się z innej struktury katalogów niż twoje.

Czy to jest „wirtualna środowisko”: https://virtualenv.pypa.io/en/latest/ ? Jeśli tak, to może tłumaczyć różnicę? Szczerze mówiąc, nie rozumiem dobrze, w jaki sposób Python zarządza bibliotekami - będziesz potrzebować eksperta w Pythonie!

Dodatkowo (aby odpowiedzieć na twój komentarz na temat SHA1) - nie pamiętam, czy musiałem zainstalować konkretny pakiet, aby uzyskać narzędzie „ shasum ” - najwyraźniej jest to skrypt Perla. Ale cokolwiek, co może wygenerować sumę kontrolną (lub nawet push, po prostu zrób „ls -l”), zrobię to.

Jeszcze jeden kawałek informacji, na wypadek, gdyby ktoś pomógł zawęzić problem

$ uname -a
Linux beeplus 3.18.8+ #761 PREEMPT Fri Feb 27 15:43:30 GMT 2015 armv6l GNU/Linux
monojohnny
źródło
Dodano informacje o mojej wersji do opisu. Mam taki sam openssl jak ty.
jrel
I tak, wyszukiwanie błędu nie daje pewnych rezultatów, ale żaden z nich nie ma rozdzielczości.
jrel
1
Import dla OpenSSL wydaje się wyzwalać sekwencję innych importów w samej bibliotece - może spróbuj zaimportować je pojedynczo, aby zawęzić błąd? Zedytuję swój post, aby pokazać, co mam na myśli.
monojohnny
Tak, wygląda na to, że osiągasz sedno tego. Ale co teraz?
jrel
Przypuszczam, że może to być problem z pakowaniem w Pythonie - może być przesyłany pocztą z postem z tagiem Python na głównej stronie StackOverFlow - i sprawdź, czy niektórzy eksperci w Pythonie mogą pomóc.
monojohnny
1

Właśnie miałem bardzo podobny problem na Pi (B).

import OpenSSLspowodowało dokładnie taką samą błędną odpowiedź. Uruchomienie pip listpokazało pyOpenSSL jako v 0.14.

Po wyczerpaniu wszystkich innych pomysłów usunąłem pyOpenSSL sudo pip uninstall pyOpenSSL

pip listnastępnie pokazał pyOpenSSL jako v0.13. Zrobiłem sudo pip uninstall pyOpenSSL2 lub 3 razy pip listjeszcze, ale nadal pokazuje pyOpenSSL (0,13)

Potem okazało się, że import OpenSSLnie pokazało to problemu jak wcześniej. Również początkowy problem, który rozwiązałem, magicznie zniknął.

Mam nadzieję że to pomoże.

AlgoaBay
źródło
0

Nie ma problemu na 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
źródło
0

To zadziałało dla mnie!

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
źródło