Erro de Python e OpenSSL na importação

10

Então, eu estou tentando adicionar SSL ao meu servidor web em execução no meu pi B + (usando cherrypy)

Verifiquei se o OpenSSL foi instalado com:

sudo apt-get install openssl

Então eu instalei o pyOpenSSL com:

sudo apt-get install python-openssl

Nos dois casos, diz:

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

Porque eu executei o comando mais de uma vez. Então isso parece bom.

Até então, em python, quando eu faço:

import OpenSSL

Eu recebo erros. Especificamente:

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

Eu tenho um problema de compatibilidade aqui? As duas versões mais recentes são incompatíveis entre si? Alguém viu isso antes?

As informações da versão que tenho:

% openssl version
OpenSSL 1.0.1e 11 Feb 2013

E para python-openssl eu tenho:

% 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

Ao usar o sinalizador -v no python, recebo:

>>> 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
fonte
se nenhuma das outras respostas trabalho dar a este um pip tentativa instalar criptografia
Steve Robillard
Uma abordagem tão simples, que pensaria que funcionava. Obrigado @SteveRobillard, você resolveu esse problema. Eu também tive que instalar as bibliotecas libffi necessárias para a criptografia (sudo pip install libffi-dev). Mas consegui instalar a criptografia e agora posso importar o OpenSSL sem erros. Leva muito tempo para importá-lo, mas não há erro. Sou um pouco novo por aqui, podemos fazer do seu comentário uma resposta?
jrel
Concluído, incluí o seu comentário sobre o libffi-dev para fins de completude.
9788 Steve Rogillard #

Respostas:

8

Você pode satisfazer a dependência ausente fazendo o seguinte:

instalar as bibliotecas libffi necessárias para criptografia

sudo pip install libffi-dev 

ou

sudo apt-get install libffi-dev

em seguida, instale a criptografia:

pip install cryptography
Steve Robillard
fonte
11
Eu acho que usando pip foi a causa do erro. Não me surpreenderia se o pip fosse usado para instalar o módulo openssl do Python. Isso pode ter estragado o sistema de empacotamento Debian.
Joan
@joan obrigado Eu estava curioso para saber por que minha sugestão funcionou e dois de vocês relataram que funcionava normalmente.
9788 Steve Rogillard #
Acabei de ler um conto semelhante sobre o módulo spidev do Python. O SPI I / F mudou, portanto todos precisam atualizar. Algumas pessoas não têm problemas, outras simplesmente não conseguem fazê-lo funcionar. Um sujeito acabou de postar que fazer uma desinstalação do pip (ele originalmente instalado com o pip) fez com que o módulo funcionasse magicamente.
Joan
@ joan, eu encontrei algo semelhante (sobre requisitos incompatíveis após a atualização de pacotes) fazendo uma pesquisa em uma das linhas de erro da pergunta do OP, foi aí que eu tive a idéia sobre a instalação do pip.
9788 Steve Rogillard #
@monojohnny funciona.
9788 Steve Rogillard #
2

Eu precisava reinstalar os pacotes:

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

então começou a funcionar para mim.

user50069
fonte
1

Eu apenas tentei isso em um B +; Parece funcionar para mim:

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

Não executei um 'apt-get install openssl' - apenas um para 'python-openssl'. Minha versão do Python parece idêntica à sua: qual versão do openssl é relatada a você?

O rastreamento de pilha que você relata (pelo menos as últimas linhas) aparece em outro local da Web. Por exemplo: https://mail.python.org/pipermail/python-bugs-list/2014-March/235055.html - mas não há resposta lá :-(

Talvez tente as importações que aparentemente causam um erro, uma de cada vez como esta - elas funcionam no meu sistema:

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

No entanto, tentei a outra importação mencionada pela última vez na pilha e esse erro NÃO ocorre quando tento importá-lo diretamente:

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

Além disso: esse link StackOverflow parece ser sobre a mesma coisa (em um contexto diferente) - e tem uma solução que aparentemente funcionou: /programming/24338840/installing-package-dependencies-for-scrapy

Seguindo a abordagem desta postagem StackOverFlow: /programming/7332299/trace-python-imports

Tente executar o python com um sinalizador '-v':

Recebo o seguinte para comparação:

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

E aqui está o SHA1 dos arquivos que estão sendo referidos aqui:

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

Talvez os arquivos * .so estejam ausentes / incorretos no seu sistema?

EDIT: parece que meu ambiente está carregando de uma estrutura de diretórios diferente da sua.

Este é um 'ambiente virtual': https://virtualenv.pypa.io/en/latest/ ? Se sim, isso pode explicar a diferença? Eu realmente não tenho um bom entendimento de como o Python gerencia suas bibliotecas para ser honesto - você precisará de um especialista em Python para enviar!

Além disso (para responder seu comentário sobre o SHA1) - não me lembro se tive que instalar um pacote específico para obter a ferramenta ' shasum ' - aparentemente é um script Perl. Mas qualquer coisa que possa gerar uma soma de verificação (ou até mesmo pressionar apenas um 'ls -l') fará o que eu acho.

Uma última informação, caso ajude alguém a diminuir o problema

$ uname -a
Linux beeplus 3.18.8+ #761 PREEMPT Fri Feb 27 15:43:30 GMT 2015 armv6l GNU/Linux
monojohnny
fonte
Adicionou minhas informações de versão à descrição. Eu tenho o mesmo openssl que você.
jrel
E sim, pesquisar o erro produz alguns resultados, mas nenhum deles com uma resolução.
jrel
11
A importação do OpenSSL parece acionar uma sequência de outras importações na própria biblioteca - talvez tente importá-las uma vez, para restringir o erro? Vou editar minha postagem para mostrar o que quero dizer.
monojohnny
Sim, parece que você está chegando ao ponto crucial. Mas e agora?
jrel
Supondo que isso possa ser um problema de empacotamento do Python - talvez faça uma postagem cruzada com uma postagem do Python no site principal do StackOverFlow - e veja se alguns especialistas em Python podem ajudar.
58615 Monroehnny
1

Acabei de ter um problema muito semelhante em um Pi (B).

import OpenSSLestava resultando exatamente na mesma resposta errônea. A execução pip listmostrou pyOpenSSL como v 0,14.

Depois de esgotar todas as outras idéias, removi o pyOpenSSL usando sudo pip uninstall pyOpenSSL

pip listem seguida, mostrou pyOpenSSL como v0.13. Eu fiz sudo pip uninstall pyOpenSSL2 ou 3 mais vezes, mas pip listainda mostra pyOpenSSL (0,13)

Então eu descobri que o import OpenSSLnão mostrava um problema como antes. Também questão inicial que eu estava solucionando magicamente desapareceu.

Espero que isto ajude.

AlgoaBay
fonte
0

Não há problema em um 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
:
joan
fonte
0

Isso funcionou para mim!

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
fonte