Kesalahan Python dan OpenSSL saat impor


10

Jadi saya mencoba menambahkan SSL ke server web saya yang berjalan di pi B + saya (menggunakan cherrypy)

Saya memastikan bahwa OpenSSL diinstal dengan:

sudo apt-get install openssl

Kemudian saya menginstal pyOpenSSL dengan:

sudo apt-get install python-openssl

Dalam kedua kasus dikatakan:

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

Karena saya sudah menjalankan perintah lebih dari sekali. Jadi ini sepertinya baik-baik saja.

Saat itu dalam python ketika saya melakukannya:

import OpenSSL

Saya mendapatkan kesalahan. Secara khusus:

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

Apakah saya memiliki masalah kompatibilitas di sini? Apakah dua versi terbaru tidak kompatibel satu sama lain? Adakah yang pernah melihat ini sebelumnya?

Info versi yang saya miliki:

% openssl version
OpenSSL 1.0.1e 11 Feb 2013

Dan untuk python-openssl saya punya:

% 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

Saat menggunakan flag -v pada python saya mendapatkan:

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

jika tidak ada jawaban lain yang berfungsi, cobalah pip install cryptography
Steve Robillard

Pendekatan yang sangat sederhana, siapa yang mengira itu berhasil. Terima kasih @SteveRobillard Anda telah memecahkan masalah ini. Saya juga harus menginstal libffi libraries yang dibutuhkan oleh kriptografi (sudo pip install libffi-dev). Tetapi kemudian saya dapat menginstal cryptograpy, dan sekarang saya dapat mengimpor OpenSSL tanpa kesalahan. Butuh waktu lama untuk mengimpornya, tetapi tidak salah. Saya agak baru di sini, bisakah kami membuat komentar Anda sebagai jawaban?
jrel

Selesai, saya memasukkan komentar Anda tentang libffi-dev untuk kelengkapan.
Steve Robillard

Jawaban:


8

Anda dapat memenuhi ketergantungan yang hilang dengan melakukan hal berikut:

instal perpustakaan libffi yang dibutuhkan oleh kriptografi

sudo pip install libffi-dev 

atau

sudo apt-get install libffi-dev

lalu instal kriptografi:

pip install cryptography

1
Saya rasa menggunakan pip adalah penyebab kesalahan. Tidak akan mengejutkan saya jika pip digunakan untuk menginstal modul openssl Python. Itu mungkin telah mengacaukan sistem pengemasan Debian.
joan

@ Joan terima kasih, saya ingin tahu mengapa saran saya bekerja dan kalian berdua melaporkannya berfungsi normal.
Steve Robillard

Saya baru saja membaca kisah serupa tentang modul Python spidev. SPI I / F telah berubah sehingga semua orang perlu memutakhirkan. Beberapa orang tidak memiliki masalah, yang lain tidak bisa bekerja. Seorang pria baru saja memposting yang melakukan uninstall pip (awalnya dia instal dengan pip) secara ajaib membuat modul bekerja.
joan

@ Joan, saya menemukan sesuatu yang serupa (mengenai persyaratan yang tidak kompatibel setelah memutakhirkan paket) melakukan pencarian pada salah satu baris kesalahan dari pertanyaan OP, di situlah saya mendapat ide tentang instalasi pip.
Steve Robillard

@onojohnny itu berhasil.
Steve Robillard

2

Saya perlu menginstal ulang paket:

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

kemudian mulai bekerja untuk saya.


1

Saya baru saja mencoba ini pada B +; sepertinya bekerja untuk saya:

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

Saya tidak menjalankan 'apt-get install openssl' - hanya satu untuk 'python-openssl'. Versi Python saya tampaknya identik dengan versi Anda: versi openssl apa yang dilaporkan kembali kepada Anda?

Jejak tumpukan yang Anda laporkan (setidaknya beberapa baris terakhir) muncul di tempat lain di web. Misalnya: https://mail.python.org/pipermail/python-bugs-list/2014-March/235055.html - tidak ada respons di sana: :(

Mungkin coba impor yang ternyata menyebabkan kesalahan, satu per satu seperti ini - ini bekerja pada sistem saya:

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

Namun saya mencoba impor lain yang disebutkan terakhir di tumpukan, dan ini TIDAK MEMBUAT ketika saya mencoba dan langsung mengimpornya:

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

Selain itu: tautan StackOverflow ini tampaknya memiliki kesamaan (dalam konteks yang berbeda) - dan memiliki solusi yang tampaknya berhasil: /programming/24338840/installing-package-dependencies-for-scrapy

Mengambil pendekatan dari posting StackOverFlow ini: /programming/7332299/trace-python-imports

Coba jalankan python dengan tanda '-v':

Saya mendapatkan yang berikut untuk perbandingan:

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

Dan inilah SHA1 dari file yang dirujuk di sini:

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

Mungkin file * .so hilang / salah pada sistem Anda?

EDIT: sepertinya lingkungan saya memuat dari struktur direktori yang berbeda dari milik Anda.

Apakah ini 'virtual env': https://virtualenv.pypa.io/en/latest/ ? Jika demikian, itu mungkin menjelaskan perbedaannya? Saya benar-benar tidak memiliki pemahaman yang baik tentang bagaimana Python mengelola perpustakaan itu jujur ​​- Anda akan memerlukan ahli Python untuk mengirim!

Selain itu (untuk menjawab komentar Anda tentang SHA1) - Saya tidak ingat apakah saya harus menginstal paket tertentu untuk mendapatkan alat ' shasum ' - ini sepertinya Skrip Perl. Tapi apa pun yang dapat menghasilkan checksum (atau bahkan hanya dengan menekan lakukan 'ls-l') akan saya kira.

Sedikit informasi terakhir, seandainya ini membantu siapa pun mempersempit masalah

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

Menambahkan info versi saya ke deskripsi. Saya memiliki openssl yang sama seperti Anda.
jrel

Dan ya, mencari kesalahan memang membuahkan beberapa hasil, tetapi tidak satupun dari mereka dengan resolusi.
jrel

1
Impor untuk OpenSSL tampaknya memicu serangkaian impor lain di perpustakaan itu sendiri - mungkin mencoba mengimpornya satu per satu, untuk mempersempit kesalahan? Saya akan mengedit posting saya untuk menunjukkan apa yang saya maksud.
monojohnny

Ya, sepertinya Anda sampai pada intinya. Tapi sekarang bagaimana?
jrel

Dugaan bahwa ini mungkin masalah pengemasan Python - mungkin cross-post dengan posting bertanda Python di situs StackOverFlow utama - dan lihat apakah beberapa pakar Python dapat membantu.
monojohnny

1

Saya baru saja mengalami masalah yang sangat mirip pada Pi (B).

import OpenSSLmenghasilkan respons salah yang persis sama. Menjalankan pip listmenunjukkan pyOpenSSL sebagai v 0.14.

Setelah menghabiskan semua ide lain, saya menghapus pyOpenSSL menggunakan sudo pip uninstall pyOpenSSL

pip listkemudian menunjukkan pyOpenSSL sebagai v0.13. Saya melakukan sudo pip uninstall pyOpenSSL2 atau 3 kali lebih banyak tetapi pip listmasih menunjukkan pyOpenSSL (0.13)

Kemudian saya menemukan bahwa import OpenSSLtidak menunjukkan masalah seperti sebelumnya. Juga masalah awal saya telah pemecahan masalah menghilang secara ajaib.

Semoga ini membantu.


0

Tidak ada masalah pada 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

Ini berhasil untuk saya!

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.