Python- und OpenSSL-Fehler beim Import


10

Also versuche ich, meinem Webserver, der auf meinem pi B + läuft, SSL hinzuzufügen (mit cherrypy).

Ich habe sichergestellt, dass OpenSSL installiert wurde mit:

sudo apt-get install openssl

Dann habe ich pyOpenSSL installiert mit:

sudo apt-get install python-openssl

In beiden Fällen heißt es:

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

Weil ich den Befehl mehr als einmal ausgeführt habe. Das scheint also in Ordnung zu sein.

Bis dahin in Python, wenn ich:

import OpenSSL

Ich bekomme Fehler. Speziell:

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

Habe ich hier ein Kompatibilitätsproblem? Sind die beiden neuesten Versionen nicht miteinander kompatibel? Hat das schon mal jemand gesehen?

Die Versionsinformationen, die ich habe:

% openssl version
OpenSSL 1.0.1e 11 Feb 2013

Und für Python-OpenSSL habe ich:

% 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

Wenn ich das Flag -v auf Python verwende, bekomme ich:

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

Wenn keine der anderen Antworten funktioniert, probieren Sie es aus und installieren Sie die Kryptografie
Steve Robillard

So ein einfacher Ansatz, wer hätte gedacht, dass es funktioniert. Vielen Dank an @SteveRobillard, dass Sie dieses Problem gelöst haben. Ich musste auch die für die Kryptographie benötigten libffi-Bibliotheken installieren (sudo pip install libffi-dev). Aber dann konnte ich Cryptograpy installieren und jetzt kann ich OpenSSL ohne Fehler importieren. Der Import dauert lange, aber es tritt kein Fehler auf. Ich bin hier ein bisschen neu. Können wir Ihrem Kommentar eine Antwort geben?
jrel

Fertig, der Vollständigkeit halber habe ich Ihren Kommentar zu libffi-dev aufgenommen.
Steve Robillard

Antworten:


8

Sie können die fehlende Abhängigkeit wie folgt erfüllen:

Installieren Sie die für die Kryptografie benötigten libffi-Bibliotheken

sudo pip install libffi-dev 

oder

sudo apt-get install libffi-dev

Installieren Sie dann die Kryptografie:

pip install cryptography

1
Ich denke, die Verwendung von Pip war die Ursache des Fehlers. Es würde mich nicht überraschen, wenn pip verwendet würde, um das Python openssl-Modul zu installieren. Das hat möglicherweise das Debian-Verpackungssystem durcheinander gebracht.
Joan

@joan danke Ich war neugierig, warum mein Vorschlag funktioniert hat und zwei von euch haben berichtet, dass er normal funktioniert.
Steve Robillard

Ich habe gerade eine ähnliche Geschichte über das Python-Spidev-Modul gelesen. Die SPI-I / F wurde geändert, sodass jeder ein Upgrade durchführen muss. Einige Leute haben kein Problem, andere können es einfach nicht zum Laufen bringen. Ein Kerl hat gerade geschrieben, dass eine Pip-Deinstallation (er hat sie ursprünglich mit pip installiert) das Modul auf magische Weise zum Laufen gebracht hat.
Joan

@joan, ich habe etwas Ähnliches gefunden (in Bezug auf inkompatible Anforderungen nach dem Upgrade von Paketen), als ich eine Suche in einer der Fehlerzeilen aus der Frage des OP durchgeführt habe. Dort kam mir die Idee zur Pip-Installation.
Steve Robillard

@ Monojohnny es funktioniert.
Steve Robillard

2

Ich musste die Pakete neu installieren:

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

dann fing es an für mich zu arbeiten.


1

Ich habe es gerade mit einem B + versucht. scheint für mich zu funktionieren:

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

Ich habe allerdings keine 'apt-get install openssl' ausgeführt - nur eine für 'python-openssl'. Meine Python-Version scheint mit Ihrer identisch zu sein: Welche Version von openssl wird Ihnen zurückgemeldet?

Die von Ihnen gemeldete Stapelverfolgung (mindestens die letzten Zeilen) wird an anderer Stelle im Web angezeigt. Zum Beispiel: https://mail.python.org/pipermail/python-bugs-list/2014-March/235055.html - keine Antwort darauf :-(

Versuchen Sie vielleicht die Importe, die anscheinend nacheinander einen Fehler verursachen - diese funktionieren auf meinem System:

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

Ich habe jedoch den anderen Import versucht, der zuletzt im Stapel erwähnt wurde, und dieser Fehler tritt auf, wenn ich versuche, ihn direkt zu importieren:

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

Zusätzlich: Dieser StackOverflow-Link scheint ungefähr dasselbe zu sein (in einem anderen Kontext) - und hat eine Lösung, die anscheinend funktioniert hat: /programming/24338840/installing-package-dependencies-for-scrapy

Nehmen Sie den Ansatz aus diesem StackOverFlow-Beitrag: /programming/7332299/trace-python-imports

Versuchen Sie, Python mit einem '-v'-Flag auszuführen:

Zum Vergleich bekomme ich folgendes:

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

Und hier ist die SHA1 der Dateien, auf die hier verwiesen wird:

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

Vielleicht fehlen / sind die * .so-Dateien auf Ihrem System falsch?

BEARBEITEN: Es sieht so aus, als würde meine Umgebung aus einer anderen Verzeichnisstruktur als Ihrer geladen.

Ist dies eine "virtuelle Umgebung": https://virtualenv.pypa.io/en/latest/ ? Wenn ja, könnte das den Unterschied erklären? Ich habe nicht wirklich ein gutes Verständnis dafür, wie Python seine Bibliotheken verwaltet, um ehrlich zu sein - Sie benötigen einen Python-Experten, um einschicken zu können!

Zusätzlich (um Ihren Kommentar zu SHA1 zu beantworten) - Ich kann mich nicht erinnern, ob ich ein bestimmtes Paket installieren musste, um das ' shasum' -Tool zu erhalten - es ist anscheinend ein Perl-Skript. Aber alles, was eine Prüfsumme erzeugen kann (oder sogar bei einem Push einfach ein 'ls-l'), wird es tun, denke ich.

Eine letzte Information, falls sie jemandem hilft, das Problem einzugrenzen

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

Meine Versionsinformationen wurden zur Beschreibung hinzugefügt. Ich habe das gleiche OpenSL wie Sie.
jrel

Und ja, die Suche nach dem Fehler führt zwar zu einigen Ergebnissen, aber keines mit einer Auflösung.
jrel

1
Der Import für OpenSSL scheint eine Folge anderer Importe in der Bibliothek selbst auszulösen - versuchen Sie vielleicht, sie einzeln zu importieren, um den Fehler einzugrenzen? Ich werde meinen Beitrag bearbeiten, um zu zeigen, was ich meine.
Monojohnny

Ja, es sieht so aus, als würden Sie den Kern der Sache erreichen. Aber was jetzt?
jrel

Unter der Annahme, dass dies ein Python-Verpackungsproblem sein könnte - möglicherweise mit einem Python-markierten Beitrag auf der StackOverFlow-Hauptseite - und prüfen Sie, ob einige Python-Experten helfen können.
Monojohnny

1

Ich hatte gerade ein sehr ähnliches Problem mit einem Pi (B).

import OpenSSLführte zu genau der gleichen fehlerhaften Antwort. Das Laufen pip listzeigte pyOpenSSL als v 0.14.

Nachdem ich alle anderen Ideen erschöpft hatte, entfernte ich pyOpenSSL mit sudo pip uninstall pyOpenSSL

pip listzeigte dann pyOpenSSL als v0.13. Ich habe sudo pip uninstall pyOpenSSL2 oder 3 weitere Male gemacht, pip listzeigt aber immer noch pyOpenSSL (0.13)

Dann stellte ich fest, dass das import OpenSSLkein Problem wie zuvor zeigte. Auch das anfängliche Problem, das ich bei der Fehlerbehebung hatte, verschwand auf magische Weise.

Hoffe das hilft.


0

Kein Problem auf einem 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

Das hat bei mir funktioniert!

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.