Ошибка Python и OpenSSL при импорте

10

Поэтому я пытаюсь добавить SSL на мой веб-сервер, работающий на моем пи B + (используя cherrypy)

Я убедился, что OpenSSL был установлен с:

sudo apt-get install openssl

Затем я установил pyOpenSSL с:

sudo apt-get install python-openssl

В обоих случаях говорится:

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

Потому что я запускал команду более одного раза. Так что это выглядит хорошо.

К тому времени в Python, когда я делаю:

import OpenSSL

Я получаю ошибки. В частности:

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

У меня есть проблема совместимости здесь? Две последние версии несовместимы друг с другом? Кто-нибудь видел это раньше?

Информация о версии у меня есть:

% openssl version
OpenSSL 1.0.1e 11 Feb 2013

А для python-openssl у меня есть:

% 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

При использовании флага -v на python я получаю:

>>> 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
источник
если ни один из других ответов не сработает, дайте этому попытку установить криптографию с помощью pip
Стив Робиллард
Такой простой подход, кто бы мог подумать, что это сработало. Спасибо @SteveRobillard, вы решили эту проблему. Мне также пришлось установить библиотеки libffi, необходимые для криптографии (sudo pip install libffi-dev). Но тогда я смог установить криптографию, и теперь я могу импортировать OpenSSL без ошибок. Импорт занимает много времени, но это не ошибка. Я немного новичок здесь, мы можем сделать ваш комментарий ответом?
jrel
Готово, я включил ваш комментарий относительно libffi-dev для полноты.
Стив Робиллард

Ответы:

8

Вы можете удовлетворить отсутствующую зависимость, выполнив следующие действия:

установить библиотеки libffi, необходимые для криптографии

sudo pip install libffi-dev 

или

sudo apt-get install libffi-dev

затем установите криптографию:

pip install cryptography
Стив Робиллард
источник
1
Я считаю, что использование pip было причиной ошибки. Меня не удивит использование pip для установки модуля Python openssl. Это могло испортить систему упаковки Debian.
Джоан
@ joan спасибо. Мне было любопытно, почему мое предложение сработало, и двое из вас сообщили, что оно работает нормально.
Стив Робиллард
Я только что прочитал похожий рассказ о модуле Python Spidev. SPI I / F изменился, поэтому все должны обновить. У некоторых людей нет проблем, другие просто не могут заставить его работать. Парень только что написал, что удаление pip (он изначально был установлен с pip) волшебным образом заставило модуль работать.
Джоан
@joan, я обнаружил нечто подобное (в отношении несовместимых требований после обновления пакетов), выполняя поиск по одной из строк ошибок из вопроса OP, и именно здесь у меня появилась идея об установке pip.
Стив Робиллард
@monojohnny это работает.
Стив Робиллард
2

Мне нужно было переустановить пакеты:

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

тогда это начало работать для меня.

user50069
источник
1

Я только что попробовал это на B +; Кажется, работает для меня:

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

Я не запускал 'apt-get install openssl' - только один для 'python-openssl'. Моя версия на Python идентична вашей: какая версия openssl вам сообщается?

Трассировка стека, о которой вы сообщаете (хотя бы последние несколько строк), появляется в другом месте в Интернете. Например: https://mail.python.org/pipermail/python-bugs-list/2014-March/235055.html - там нет ответа :-(

Может быть, попробуйте импортировать, которые, по-видимому, вызывают ошибку, по одному, например, это - это работает на моей системе:

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

Однако я попробовал другой импорт, который упомянут последним в стеке, и эта ошибка ДЕЙСТВУЕТ, когда я пытаюсь напрямую импортировать его:

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

Дополнительно: эта ссылка на StackOverflow выглядит примерно одинаково (в другом контексте) и имеет решение, которое, очевидно, сработало: /programming/24338840/installing-package-dependencies-for-scrapy

Использование подхода из этого поста StackOverFlow: /programming/7332299/trace-python-imports

Попробуйте запустить python с флагом '-v':

Я получаю следующее для сравнения:

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

И вот SHA1 файлов, на которые ссылаются здесь:

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

Может быть, файлы * .so отсутствуют / неверны в вашей системе?

РЕДАКТИРОВАТЬ: похоже, что моя среда загружается из структуры каталогов, отличной от вашей.

Является ли это «виртуальным окружением»: https://virtualenv.pypa.io/en/latest/ ? Если так, то это может объяснить разницу? Честно говоря, я не очень хорошо понимаю, как Python управляет своими библиотеками - вам понадобится эксперт по Python для доставки!

Дополнительно (чтобы ответить на ваш комментарий о SHA1) - я не могу вспомнить, пришлось ли мне устанавливать конкретный пакет, чтобы получить инструмент ' shasum ' - это, очевидно, Perl Script. Но все, что может сгенерировать контрольную сумму (или даже нажать «ls -l»), я думаю.

И последний кусочек информации, на случай, если это поможет кому-то сузить проблему.

$ uname -a
Linux beeplus 3.18.8+ #761 PREEMPT Fri Feb 27 15:43:30 GMT 2015 armv6l GNU/Linux
monojohnny
источник
Добавил информацию о моей версии в описание. У меня такой же openssl, как и у вас.
Jrel
И да, поиск ошибки действительно дает некоторые результаты, но ни один из них не имеет разрешения.
Jrel
1
Похоже, что импорт для OpenSSL запускает последовательность других импортов в самой библиотеке - возможно, попробуйте импортировать их по одному, чтобы сузить ошибку? Я отредактирую свой пост, чтобы показать, что я имею в виду.
monojohnny
Да, похоже, вы понимаете суть этого. Но что теперь?
Jrel
Предполагая, что это может быть проблема с упаковкой Python - возможно, перекрестная публикация с пометкой Python на главном сайте StackOverFlow - и посмотреть, могут ли помочь некоторые эксперты Python.
monojohnny
1

У меня только что была очень похожая проблема с Pi (B).

import OpenSSLпривело к точно такой же ошибочной реакции. Запуск pip listпоказал pyOpenSSL как v 0,14.

После исчерпания всех других идей я удалил pyOpenSSL, используя sudo pip uninstall pyOpenSSL

pip listзатем показал pyOpenSSL как v0.13. Я сделал еще sudo pip uninstall pyOpenSSL2 или 3 раза, но pip listвсе еще показывает pyOpenSSL (0,13)

Затем я обнаружил, что import OpenSSLпроблема не проявлялась как раньше. Также первоначальная проблема, которую я устранял, волшебным образом исчезла.

Надеюсь это поможет.

AlgoaBay
источник
0

Нет проблем на 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

Это сработало для меня!

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
источник