Lỗi Python và OpenSSL khi nhập


10

Vì vậy, tôi đang cố gắng thêm SSL vào máy chủ web của mình đang chạy trên pi B + (sử dụng cherrypy)

Tôi chắc chắn rằng OpenSSL đã được cài đặt với:

sudo apt-get install openssl

Sau đó, tôi đã cài đặt pyOpenSSL với:

sudo apt-get install python-openssl

Trong cả hai trường hợp, nó nói:

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

Bởi vì tôi đã chạy lệnh nhiều lần. Vì vậy, điều này có vẻ tốt.

Đến lúc đó trong python khi tôi làm:

import OpenSSL

Tôi nhận được lỗi. Đặc biệt:

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

Tôi có một vấn đề tương thích ở đây? Có phải hai phiên bản mới nhất không tương thích với nhau? Có ai nhìn thấy điều này trước đây?

Thông tin phiên bản tôi có:

% openssl version
OpenSSL 1.0.1e 11 Feb 2013

Và đối với python-openssl tôi có:

% 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

Khi sử dụng cờ -v trên python tôi nhận được:

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

nếu không có câu trả lời nào khác hoạt động, hãy thử dùng mật mã cài đặt pip
Steve Robillard

Một cách tiếp cận đơn giản như vậy, ai có thể nghĩ rằng nó đã làm việc. Cảm ơn @SteveRobillard bạn đã giải quyết vấn đề này. Tôi cũng phải cài đặt các thư viện libffi cần thiết bằng mật mã (sudo pip install libffi-dev). Nhưng sau đó tôi đã có thể cài đặt tiền điện tử và bây giờ tôi có thể nhập OpenSSL mà không gặp lỗi. Phải mất một thời gian dài để nhập nó, nhưng nó không bị lỗi. Tôi là một chút mới ở đây, chúng ta có thể làm cho nhận xét của bạn một câu trả lời?
jrel

Xong, tôi đã bao gồm nhận xét của bạn về libffi-dev cho đầy đủ.
Steve Robillard

Câu trả lời:


8

Bạn có thể đáp ứng sự phụ thuộc còn thiếu bằng cách làm như sau:

cài đặt các thư viện libffi cần thiết bằng mật mã

sudo pip install libffi-dev 

hoặc là

sudo apt-get install libffi-dev

sau đó cài đặt mật mã:

pip install cryptography

1
Tôi nghĩ rằng sử dụng pip là nguyên nhân của lỗi. Tôi sẽ không ngạc nhiên nếu pip được sử dụng để cài đặt mô-đun openssl của Python. Điều đó có thể đã làm hỏng hệ thống đóng gói Debian.
gia

@joan cảm ơn tôi đã tò mò tại sao đề nghị của tôi hoạt động và hai bạn báo cáo nó hoạt động bình thường.
Steve Robillard

Tôi vừa đọc một câu chuyện tương tự về mô-đun spidev của Python. SPI I / F đã thay đổi nên mọi người cần nâng cấp. Một số người không có vấn đề gì, những người khác không thể làm cho nó hoạt động được. Một chap vừa đăng tải rằng thực hiện gỡ cài đặt pip (ban đầu anh ta cài đặt với pip) làm cho mô-đun hoạt động một cách kỳ diệu.
gia

@joan, tôi đã tìm thấy một cái gì đó tương tự (liên quan đến các yêu cầu không tương thích sau khi nâng cấp gói) thực hiện tìm kiếm trên một trong các dòng lỗi từ câu hỏi của OP, đó là nơi tôi có ý tưởng về cài đặt pip.
Steve Robillard

@monojohnny nó không hoạt động.
Steve Robillard

2

Tôi cần phải cài đặt lại các gói:

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

sau đó nó bắt đầu làm việc cho tôi


1

Tôi vừa thử cái này trên B +; Dường như làm việc cho tôi:

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

Mặc dù vậy, tôi đã không chạy 'apt-get install openssl' - chỉ một lần cho 'python-openssl'. Phiên bản Python của tôi có vẻ giống hệt với phiên bản của bạn: phiên bản openssl nào được báo cáo lại cho bạn?

Theo dõi ngăn xếp mà bạn báo cáo (ít nhất là một vài dòng cuối cùng) xuất hiện ở nơi khác trên web. Ví dụ: https://mail.python.org/pipermail/python-bugs-list/2014-March/235055.html - mặc dù không có phản hồi nào ở đó :-(

Có thể thử các lần nhập có vẻ gây ra lỗi, mỗi lần như thế này - chúng hoạt động trên hệ thống của tôi:

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

Tuy nhiên, tôi đã thử cách nhập khác được đề cập cuối cùng trong ngăn xếp và lỗi này xảy ra khi tôi thử và nhập trực tiếp:

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

Ngoài ra: liên kết StackOverflow này dường như là về cùng một thứ (trong một bối cảnh khác) - và có một giải pháp rõ ràng có hiệu quả: /programming/24338840/installing-package-dependencies-for-scrapy

Lấy cách tiếp cận từ bài đăng StackOverFlow này: /programming/7332299/trace-python-imports

Hãy thử chạy python với cờ '-v':

Tôi nhận được những điều sau đây để so sánh:

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

Và đây là SHA1 của các tệp được giới thiệu ở đây:

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

Có lẽ các tệp * .so bị thiếu / sai trên hệ thống của bạn?

EDIT: có vẻ như môi trường của tôi đang tải từ một cấu trúc thư mục khác từ bạn.

Đây có phải là en env ảo ': https://virtualenv.pypa.io/en/latest/ ? Nếu vậy, điều đó có thể giải thích cho sự khác biệt? Tôi thực sự không hiểu rõ về cách Python quản lý các thư viện của nó một cách trung thực - bạn sẽ cần một chuyên gia Python để gửi hàng!

Ngoài ra (để trả lời nhận xét của bạn về SHA1) - Tôi không thể nhớ nếu tôi phải cài đặt một gói cụ thể để có được công cụ ' shasum ' - rõ ràng đó là Perl Script. Nhưng bất cứ điều gì có thể tạo ra một tổng kiểm tra (hoặc thậm chí chỉ bằng một cú đẩy chỉ cần thực hiện một 'ls -l') sẽ làm tôi đoán.

Một thông tin cuối cùng, trong trường hợp nó giúp bất kỳ ai thu hẹp vấn đề

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

Đã thêm thông tin phiên bản của tôi vào mô tả. Tôi có cùng openssl như bạn.
jrel

Và có, tìm kiếm trên lỗi không tạo ra một số kết quả, nhưng không có kết quả nào có độ phân giải.
jrel

1
Việc nhập cho OpenSSL dường như kích hoạt một chuỗi các lần nhập khác trong chính thư viện - có thể thử nhập chúng cùng một lúc, để thu hẹp lỗi? Tôi sẽ chỉnh sửa bài viết của mình để thể hiện điều tôi muốn nói.
monojohnny

Vâng, có vẻ như bạn đang đi đến mấu chốt của nó. Nhưng bây giờ thì sao?
jrel

Theo dự đoán, đây có thể là sự cố đóng gói Python - có thể là bài đăng chéo với bài đăng được gắn thẻ Python trên trang web StackOverFlow chính - và xem liệu một số chuyên gia Python có thể giúp đỡ không.
monojohnny

1

Tôi vừa có một vấn đề rất giống với Pi (B).

import OpenSSLđã dẫn đến kết quả chính xác là phản ứng sai lầm. Chạy pip listcho thấy pyOpenSSL là v 0,14.

Sau khi cạn kiệt tất cả các ý tưởng khác, tôi đã loại bỏ pyOpenSSL bằng cách sử dụng sudo pip uninstall pyOpenSSL

pip listsau đó hiển thị pyOpenSSL là v0.13. Tôi đã làm sudo pip uninstall pyOpenSSL2 hoặc 3 lần nữa nhưng pip listvẫn hiển thị pyOpenSSL (0.13)

Sau đó, tôi thấy rằng import OpenSSLđã không hiển thị một vấn đề như trước đây. Ngoài ra vấn đề ban đầu tôi đã được xử lý sự cố biến mất một cách kỳ diệu.

Hi vọng điêu nay co ich.


0

Không có vấn đề trên 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

Điều này làm việc cho tôi!

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.