ข้อผิดพลาด Python และ OpenSSL ในการนำเข้า


10

ดังนั้นฉันจึงพยายามที่จะเพิ่ม SSL ไปยังเว็บเซิร์ฟเวอร์ของฉันทำงานบน pi 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.

เพราะฉันรันคำสั่งมากกว่าหนึ่งครั้ง ดังนั้นนี่ดูเหมือนดี

จากนั้นในหลามเมื่อฉัน:

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

ถ้าไม่มีคำตอบอื่นใดให้ลองใช้การเข้ารหัส pip ลองติดตั้ง
Steve Robillard

วิธีการง่ายๆเช่นนี้ใครจะคิดว่ามันใช้ได้ ขอบคุณ @SteveRobillard คุณแก้ไขปัญหานี้แล้ว ฉันต้องติดตั้งไลบรารี libffi ที่จำเป็นโดยการเข้ารหัส (sudo pip install libffi-dev) แต่ฉันสามารถติดตั้ง cryptograpy ได้และตอนนี้ฉันสามารถนำเข้า OpenSSL ได้โดยไม่มีข้อผิดพลาด ใช้เวลานานในการนำเข้า แต่ไม่มีข้อผิดพลาด ฉันค่อนข้างใหม่ที่นี่เราสามารถให้ความคิดเห็นของคุณเป็นคำตอบได้ไหม?
jrel

เสร็จแล้วฉันรวมความคิดเห็นของคุณเกี่ยวกับ libffi-dev เพื่อความสมบูรณ์
Steve Robillard

คำตอบ:


8

คุณสามารถพึงพอใจการพึ่งพาที่ขาดหายไปได้โดยทำดังนี้

ติดตั้งไลบรารี libffi ที่ต้องการโดยการเข้ารหัส

sudo pip install libffi-dev 

หรือ

sudo apt-get install libffi-dev

จากนั้นติดตั้งการเข้ารหัส:

pip install cryptography

1
ฉันคิดว่าการใช้ pip เป็นสาเหตุของข้อผิดพลาด มันจะไม่แปลกใจถ้า pip ถูกใช้เพื่อติดตั้งโมดูล Python openssl นั่นอาจทำให้ระบบบรรจุภัณฑ์ของเดเบียนมีอาการเมา
joan

@ ขอบคุณขอบคุณฉันอยากรู้ว่าทำไมข้อเสนอแนะของฉันถึงใช้ได้และคุณสองคนรายงานว่าใช้งานได้ตามปกติ
Steve Robillard

ฉันเพิ่งอ่านเรื่องที่คล้ายกันเกี่ยวกับโมดูล Python spidev SPI I / F มีการเปลี่ยนแปลงดังนั้นทุกคนต้องอัพเกรด บางคนไม่มีปัญหาบางคนก็ไม่สามารถทำงานได้ CHAP เพิ่งโพสต์ว่าทำการถอนการติดตั้ง pip (แต่เดิมเขาติดตั้งด้วย pip) ทำให้โมดูลทำงานได้อย่างน่าอัศจรรย์
joan

@joan ฉันพบสิ่งที่คล้ายกัน (เกี่ยวกับข้อกำหนดที่เข้ากันไม่ได้หลังจากอัปเกรดแพ็คเกจ) ทำการค้นหาหนึ่งในบรรทัดข้อผิดพลาดจากคำถามของ OP ซึ่งเป็นที่ที่ฉันได้รับแนวคิดเกี่ยวกับการติดตั้งจุดเล็ก ๆ
Steve Robillard

@monojohnny มันใช้งานได้
Steve Robillard

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 ของฉันดูเหมือนจะเหมือนกันกับคุณ: 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 อาจจะหายไป / ผิดในระบบของคุณ?

แก้ไข: ดูเหมือนว่าสภาพแวดล้อมของฉันกำลังโหลดจากโครงสร้างไดเรกทอรีที่แตกต่างจากคุณ

นี่คือ 'virtual env': https://virtualenv.pypa.io/en/latest/หรือไม่ ถ้าเป็นเช่นนั้นอาจมีความแตกต่างกันบ้าง? ฉันไม่มีความเข้าใจที่ดีว่า Python จัดการกับห้องสมุดอย่างไรให้ซื่อสัตย์คุณจะต้องมีผู้เชี่ยวชาญ Python ที่จะจัดส่ง!

นอกจากนี้ (เพื่อตอบความคิดเห็นของคุณเกี่ยวกับ SHA1) - ฉันจำไม่ได้ว่าต้องติดตั้งแพคเกจเฉพาะเพื่อรับเครื่องมือ ' shasum ' หรือไม่ - เป็นสคริปต์ 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.