Помилка Python та OpenSSL при імпорті


10

Тому я намагаюся додати SSL до свого веб-сервера, який працює на моєму pi B + (використовуючи вишневий)

Я переконався, що 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

якщо жоден з інших відповідей не працює дати цьому спробу встановити піп криптографії
Steve Робійяр

Такий простий підхід, хто б міг подумати, що це працює. Дякую @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. Мене не здивувало б, якщо для встановлення модуля Python openssl був використаний pip. Це, можливо, накрутило систему упаковки Debian.
Жанна

@joan дякую, мені було цікаво, чому моя пропозиція спрацювала, і ви двоє з них повідомили, що вона працює нормально.
Стів Робіллард

Я щойно прочитав подібну казку про модуль Python spidev. SPI I / F змінився, тому всі потребують оновлення. У деяких людей немає проблем, інші просто не можуть змусити його працювати. Щойно опублікований глава, що видалення піп-файлу (він спочатку встановлений за допомогою pip) магічно змусив модуль працювати.
Жанна

@joan, я виявив щось подібне (щодо несумісних вимог після оновлення пакетів), здійснюючи пошук по одній з рядків помилок із запитання про ОП, саме там я отримав уявлення про встановлення pip.
Стів Робільярд

@monojohnny це працює.
Стів Робільярд

2

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

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

тоді це почало працювати на мене.


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 виявляється ідентичною вашій: про яку версію Opensl повідомляється вам?

Слід стеку, про який ви повідомляєте (принаймні останні кілька рядків), з’являється в іншому місці в Інтернеті. Наприклад: 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 файли відсутні / неправильні у вашій системі?

EDIT: схоже, моє середовище завантажується з іншої структури каталогу від вашого.

Це "віртуальна середовище": https://virtualenv.pypa.io/en/latest/ ? Якщо так, це може спричинити різницю? Я не дуже добре розумію, як Python керує своїми бібліотеками, якщо чесно - вам знадобиться експерт Python для доставки!

Додатково (щоб відповісти на ваш коментар про SHA1) - я не можу пригадати, чи довелося мені встановити певний пакет, щоб отримати інструмент ' шасум ' - очевидно, це сценарій Perl. Але я думаю, що все, що може створити контрольну суму (або навіть при натисканні просто зробити 'ls -l').

Один останній біт інформації, якщо вона допоможе комусь звузити проблему

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

До опису додано інформацію про мою версію. У мене такий самий 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випуск не показував проблему, як раніше. Також початковий випуск, у якого були проблеми, магічно зник.

Сподіваюсь, це допомагає.


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.