Erro de back-end SSL ao usar OpenSSL

87

Eu estava tentando instalar o pycurl em um virtualenv usando pip e recebi este erro

ImportError: pycurl: libcurl link-time ssl backend (openssl) is different from compile-time ssl backend (none/other)

Eu li alguma documentação dizendo que "Para consertar isso, você precisa dizer ao setup.py qual backend SSL é usado" (fonte), embora não tenha certeza de como fazer isso, pois instalei o pycurl usando pip.

Como posso especificar o back-end SSL ao instalar o pycurl com pip?

obrigado

helloworld2013
fonte
1
Qual é o seu sistema operacional?
Evgenii

Respostas:

121

Depois de ler o arquivo INSTALLATION, consegui resolver o meu problema definindo uma variável de ambiente e fiz uma reinstalação

  • remover pycurlinstalação existente

    pip uninstall pycurl

  • variável de exportação com seu back-end SSL de tempo de link (que é openssl acima)

    export PYCURL_SSL_LIBRARY=openssl

  • em seguida, re-instalar pycurlcom sem cache

    pip install pycurl --no-cache-dir

Não poderia haver outra solução lá fora, mas isso funciona perfeitamente para mim em um virtualenve pipinstalação.

helloworld2013
fonte
2
Obrigado, PYCURL_SSL_LIBRARY=opensslfunciona perfeitamente!
thnee
Para usuários do mac os x : não se lembre de usar em set -x PYCURL_SSL_LIBRARY opensslvez de export PYCURL_SSL_LIBRARY=opensslse usar o console do fish em vez do bash .
Serge
13
pip install pycurl --no-cache-dir
Shuguang Yang
Obrigado. Procurei várias soluções possíveis para esse problema. Esta solução funcionou pela primeira vez.
Matt Setter
passo a passo exemplo de instalação do virtualenv yippeecode.com/view-code/343QWQT144/…
helloworld2013
77

A resposta de helloworld2013 está correta, mas a chave corresponde à biblioteca SSL que pycurl espera. O erro será algo como:

pycurl: backend ssl de tempo de link libcurl ( <library> ) é diferente do backend ssl de tempo de compilação ( <library> ou " nenhum / outro ")

Para consertar, você deve usar a biblioteca que pycurl está esperando. No meu caso, meu erro foi " pycurl: libcurl link-time ssl backend ( nss ) é diferente do tempo de compilação ssl backend (openssl) ", então minha correção foi:

pip uninstall pycurl
export PYCURL_SSL_LIBRARY=nss
pip install pycurl
DrStrangepork
fonte
1
Brilhante. Isso deve gerar mais votos. A resposta original se aplica a algumas máquinas. Esta é uma forma mais geral de consertar dependendo da plataforma.
Nishant
6
hmm isso não funcionou para mim em um mac. Parece que PYCURL_SSL_LIBRARYestá sendo completamente ignorado. O backend ssl de tempo de compilação é sempre "(nenhum / outro)" para mim, embora echo PYCURL_SSL_LIBRARYopenssl.
Edward Newell,
1
como @EdwardNewell, essa correção não funcionou para mim no Scientific Linux (Rhel), embora eu tenha especificado nss para PYCURL_SSL_LIBRARY, o backend permanece (nenhum / outro)
Yondaime008
3
No Mac eu removi pycurle instalei com os sinalizadores:pip install --global-option="--with-openssl" --global-option=build_ext --global-option="-L/usr/local/opt/openssl/lib" --global-option="-I/usr/local/opt/openssl/include" pycurl
eigenein
2
Isso funcionou, mas apenas com as seguintes opções: pip install pycurl --compile --no-cache-dirno CentOS 7.3.
Robert Yi
51

Com OSX 10.13, um openSSL instalado e virtualenv, tive sucesso com:

workon ..your-environment-here..
pip uninstall pycurl
export PYCURL_SSL_LIBRARY=openssl
export LDFLAGS=-L/usr/local/opt/openssl/lib;export CPPFLAGS=-I/usr/local/opt/openssl/include;pip install pycurl --compile --no-cache-dir
Michael Wilson
fonte
4
Sim, no MacOS 10.13.1 (High Sierra), isso resolveu o problema! Muito Obrigado! Para reinstalar o openssl:brew reinstall openssl
Denis Arnaud
1
Eu consertei meu problema com ele. Obrigado :)
JeongjinKim
1
Corrigido o problema no Mac OSX 10.13.4! Obrigado.
user1192748
1
Obrigado! Também consertou meu problema. Mac OSX 10.13.4
Steven Church
2
Daryl, sinto muito por ouvir isso! Funcionou novamente para mim no Mojave, então não tenho certeza do que está acontecendo.
Michael Wilson
25

Com o pip 7.1, você pode colocar o seguinte em seu arquivo de requisitos:

pycurl==7.19.5.1 --global-option="--with-nss"

Basta substituir o nss pela biblioteca de back-end ssl relevante.

maharg101
fonte
1
Esta solução é melhor do que exportar um var e reinstalá-lo, porque ele pode ser compartilhado no arquivo requirements.txt e não precisa ser repetido por usuário.
dfarrell07
1
exportar não funcionou para mim no CentOS 7. Mas definir a opção global funcionou. Obrigado!
Aaron Nguyen
Tive que combinar sua solução com a de @Michael Wilson para fazê-la funcionar no macOS. Parece um problema de criptografia - alguma discussão aqui: github.com/pyca/cryptography/issues/3489
kip2
20

O método para corrigir o pycurl após a atualização do Mac OS High Sierra:

  1. Reinstale as bibliotecas curl para usar OpenSSL em vez de SecureTransport

    brew install curl --with-openssl
    
  2. Instale o pycurl com ambiente e caminhos de tempo de construção corretos

    export PYCURL_SSL_LIBRARY=openssl
    pip uninstall pycurl 
    pip install --no-cache-dir --global-option=build_ext --global-option="-L/usr/local/opt/openssl/lib" --global-option="-I/usr/local/opt/openssl/include" --user pycurl
    
pálido
fonte
2
Trabalhou para mim no High Sierra (usando um virtualenv).
djangoat
1
Sim! Veja também este artigo cscheng.info/2018/01/26/…
somecallitblues
Funcionou para mim no High Sierra (usando um virtualenv), mas tive que remover a sinalização
--user
Muito obrigado!! Isso foi incrivelmente útil. Executando o High Sierra e gastando algumas horas nele, esta é a única solução que funcionou :)
Alessandro
Quando usei a --userbandeira como acima, recebi:Can not perform a '--user' install. User site-packages are not visible in this virtualenv.
Daryl Spitzer de
19

Isso funcionou para mim:

pip uninstall pycurl
export PYCURL_SSL_LIBRARY=nss
easy_install pycurl

Nada disso funcionou para mim (observe que a diferença é simplesmente easy_install vs pip):

pip uninstall pycurl
export PYCURL_SSL_LIBRARY=[nss|openssl|ssl|gnutls]
pip install pycurl
#xor
curl -O https://pypi.python.org/packages/source/p/pycurl/pycurl-7.19.3.1.tar.gz
#...
python setup.py --with-[nss|openssl|ssl|gnutls] install
JoelBondurant
fonte
1
A easy_installopção foi a única que funcionou. Não entendo por que isso é tão complicado. Eu precisava export PYCURL_SSL_LIBRARY=openssl. Meu um relatou "nenhum / outro" para a biblioteca compilada.
CMCDragonkai
Acabei de me deparar com esse problema e essa solução foi a única que funcionou para mim.
Boudewijn Aasman
2
Na minha experiência, o pip não remove completamente a versão antiga do pucurl que foi instalada com o sistema operacional (Centos7.2 no meu caso). Pip não tocou nos arquivos /usr/lib64/python2.7/site-packages/pycurl.so e egg-info da versão anterior. O Easy_install, por outro lado, eliminou-os além de colocar o ovo pycurl nos pacotes do site.
sokhaty
Ugh, tentei todos os itens acima e não funcionou. Isso funcionou para mim quando minha mensagem de erro original era `` `ImportError: pycurl: libcurl link-time ssl backend (openssl) é diferente do tempo de compilação ssl backend (nenhum / outro)` ``
James McCormac
10

Eu tive esse problema por dias. Finalmente, com a ajuda de outras respostas aqui (principalmente de Alexander Tyapkov), fiz funcionar para o AWS Elastic Beanstalk.

Instalação manual (conectando com SSH):

sudo pip uninstall pycurl
curl -O https://pypi.python.org/packages/source/p/pycurl/pycurl-7.43.0.tar.gz
sudo pip install pycurl-7.43.0.tar.gz --global-option="--with-nss"

IMPORTANTE: Observe que você deve ter certeza de que está usando a versão atual do Python e do PIP, caso contrário, você pode estar compilando para Python 2.xe usando v3.x.

Instalação automática no Elastic Beanstalk:

files:
  "/usr/local/share/pycurl-7.43.0.tar.gz" :
    mode: "000644"
    owner: root
    group: root
    source: https://pypi.python.org/packages/source/p/pycurl/pycurl-7.43.0.tar.gz

commands:
  01_download_pip3:
    # run this before PIP installs requirements as it needs to be compiled with OpenSSL
    command: 'curl -O https://bootstrap.pypa.io/get-pip.py'
  02_install_pip3:
    # run this before PIP installs requirements as it needs to be compiled with OpenSSL
    command: 'python3 get-pip.py'
  03_pycurl_uninstall:
    # run this before PIP installs requirements as it needs to be compiled with OpenSSL
    command: '/usr/bin/yes | sudo pip uninstall pycurl'
  04_pycurl_download:
    # run this before PIP installs requirements as it needs to be compiled with OpenSSL
    command: 'curl -O https://pypi.python.org/packages/source/p/pycurl/pycurl-7.43.0.tar.gz'
  05_pycurl_reinstall:
    # run this before PIP installs requirements as it needs to be compiled with OpenSSL
    command: 'sudo pip install pycurl-7.43.0.tar.gz --global-option="--with-nss"'

container_commands:
  09_pycurl_reinstall:
    # run this before PIP installs requirements as it needs to be compiled with OpenSSL
    # the upgrade option is because it will run after PIP installs the requirements.txt file.
    # and it needs to be done with the virtual-env activated
    command: 'source /opt/python/run/venv/bin/activate && pip3 install /usr/local/share/pycurl-7.43.0.tar.gz --global-option="--with-nss" --upgrade'

Tive esse problema porque estava tentando configurar o Celery 4 com Django 1.10 no Elastic Beanstalk. Se for esse o seu caso, escrevi um post completo no blog sobre isso .

Diego jancic
fonte
ugh obrigado. isso pode ser irritante, especialmente porque os arquivos de configuração do eb parecem muito instáveis ​​e nunca fornecem erros razoáveis ​​(incluindo problemas de formatação)
Ian
Votei positivamente nesta resposta, pois me ajudou muito a resolver um problema semelhante ao instalar o pycurl na AWS: stackoverflow.com/questions/51019622/…
Greg Holst
8

Estou no CentOS 7. Tentei todas as opções acima e não consegui fazer nada funcionar. Acontece que eu precisava executá-los como usuário root. Portanto, se você estiver tendo problemas, tente qualquer uma das soluções acima como usuário root. Por exemplo, aqui está o que funcionou para mim:

su -
pip uninstall pycurl
export PYCURL_SSL_LIBRARY=[nss|openssl|ssl|gnutls]
pip install pycurl

Claro, todas as isenções de responsabilidade usuais sobre a execução como um usuário root se aplicam.

Nota: [nss | openssl | ssl | gnutls] no código acima significa escolher um, e não inclui os colchetes ou tubos. A pessoa que fez a pergunta original teria escolhido o opensl. No meu caso particular, escolhi nss. Sua mensagem de erro deve informar qual escolha fazer.

Edição 2019: Fazer um sudo pip installpode causar um problema com a instalação do Python no sistema da máquina. Talvez tente trabalhar em um ambiente virtual Python e instalar os pacotes lá. Se isso não funcionar, o truque do sudo em minha resposta é provavelmente uma das últimas opções a serem consideradas.

alfonso
fonte
5

Você pode baixar o arquivo tar.gz aqui . Em seguida, extraia-o em uma pasta. Você encontrará um arquivo setup.py lá. Execute o comando ali que o site mencionou. Por exemplo:

python setup.py --with-[ssl|gnutls|nss] install

Para sua informação: Tentei instalar o pycurl nas minhas janelas, mas não consegui. Mas fiz no meu linux.

Sabuj Hassan
fonte
obrigado pela resposta, mas isso só poderia funcionar para mim se eu não estivesse fazendo a instalação por meio de um virtualenv e pip
helloworld2013
@Sabuj para instalar o pycurl no Windows, use um dos instaladores fornecidos neste excelente site: lfd.uci.edu/~gohlke/pythonlibs/#pycurl
Adam
4

Estou executando isso no OS X e algumas das soluções acima não estavam funcionando. Semelhante ao comentário de Edward Newell, a PYCURL_SSL_LIBRARYvariável parecia ter sido completamente ignorada.
A leitura posterior do documento de instalação do PycURL revelou o seguinte:

pip pode reinstalar o pacote que compilou anteriormente em vez de recompilar o pycurl com opções recém-especificadas

Portanto, tive que forçá-lo a compilar com:

pip install --compile pycurl

Isso funciona em vários casos. No entanto, encontrei alguns sistemas que continuaram a ignorar a variável, então, semelhante à resposta de maharg101 , recorri às opções de instalação que por meio do pip podem ser definidas assim:

pip install pycurl --global-option="--with-[ssl|gnutls|nss]"

onde você seleciona uma das três opções dentro dos colchetes. Observe que a opção disponível é ssle não openssl . Se você especificar, --with-opensslreceberá um erro. Observe também que se você estivesse mexendo com a PYCURL_SSL_LIBRARYvariável e mudando-a para valores estranhos para ver o que aconteceria, esse último comando definitivamente o pegará e gerará um erro se o valor estiver definido, mas não for válido.

Gunga
fonte
1
desinstale o pycurl primeiro e faça os pip install pycurl --global-option="--with-nss"trabalhos para mim. Para registro, meu erro éImportError: pycurl: libcurl link-time ssl backend (nss) is different from compile-time ssl backend (openssl)
ahyong de
Obrigado @ahyong, o truque da opção global funcionou para mim, embora eu tenha tentado durante a instalação do tar, funcionou com pip, mas não com setup.py estranho ...
Yondaime008
4

Reinstalação do curl

Tentei todas as sugestões desta discussão, mas ninguém trabalhou para mim. Como solução, reinstalei o curl e o curlib. Depois disso, fui capaz de instalar o pycurl com suporte a ssl dentro do ambiente.

No início:

'PycURL / 7.43.0 libcurl / 7.47.0 GnuTLS / 3.4.10 zlib / 1.2.8 libidn / 1.32 librtmp / 2.3'

Parte 1. Re/Instalação com pip

Em primeiro lugar, removi o pycurl do virtualenv usando o pip, conforme sugerido nas respostas anteriores:

pip uninstall pycurl
export PYCURL_SSL_LIBRARY=openssl
pip install pycurl --global-option="--with-openssl"

A ideia aqui é que o pacote foi armazenado em cache e nós apenas o reinstalamos com a opção openssl.

Também tentei recompilar pycurl com pip usando:

pip install pycurl --compile pycurl --no-cache

..mas teve o mesmo erro após executar:

python
import pycurl
pycurl.version

ImportError: pycurl: libcurl backend ssl de tempo de link ( gnutls ) é diferente de backend ssl de tempo de compilação ( openssl )

Parte 2. Instalação do alcatrão

Depois que o método anterior não funcionou, decidi instalar o pycurl do tar com:

curl -O https://pypi.python.org/packages/source/p/pycurl/pycurl-7.43.0.tar.gz
sudo tar -xzvf pycurl-7.43.0.tar.gz
cd pycurl-7.43.0/
sudo python setup.py --with-ssl install

Ele instalou o pycurl globalmente, mas não no virtualenv. Também não verifiquei se foi instalado com suporte SSL ou não mas acho que ainda sem SSL.

Parte 3. Reinstalação de curl e curllib

Finalmente entendi que o pycurl não é instalado normalmente no ambiente porque o global curl e o libcurl são compilados com o gnutls.

Antes de começar, verifique com:

curl-config --configure

Uma das linhas de saída será

'--without-ssl' '--with-gnutls'

Para recompilar:

Em primeiro lugar, remova o curl:

sudo apt-get purge curl

Instale todas as dependências de compilação necessárias para curl

sudo apt-get build-dep curl

Obtenha o libcurl mais recente (em 20 de dezembro de 2016)

mkdir ~/curl
wget http://curl.haxx.se/download/curl-7.51.0.tar.bz2
tar -xvjf curl-7.51.0.tar.bz2
cd curl-7.51.0

As etapas usuais para construir um aplicativo a partir da fonte

./configure
./make
 sudo make install

Se o openssl estiver instalado corretamente, o configure o encontrará automaticamente. O resultado será:

versão curl: 7.51.0
Configuração do host: x86_64-pc-linux-gnu
Instalar prefixo: / usr / local
Compilador: gcc
SSL support: enabled (OpenSSL) ...

Resolva quaisquer problemas de caches de localização lib de nível C ("cache de biblioteca compartilhada")

sudo ldconfig

Agora tente reinstalar o pycurl no ambiente:

curl -O https://pypi.python.org/packages/source/p/pycurl/pycurl-7.43.0.tar.gz
pip install pycurl-7.43.0.tar.gz --global-option="--with-openssl"

O resultado deve ser:

python
import pycurl
pycurl.version

'PycURL / 7.43.0 libcurl / 7.51.0 OpenSSL / 1.0.2g zlib / 1.2.8 librtmp / 2.3'

Alexander Tyapkov
fonte
3

Para qualquer um que tenha problemas dentro do PyCharm CE no macOS Mojave, veja como eu o fiz funcionar no venv:

  • especifique a versão: 7.43.0.1
  • Opções: --install-option = - with-openssl --install-option = - openssl-dir = / usr / local / opt / openssl

Captura de tela do Interpretador do Projeto PyCharm

fabe
fonte
1
Para mim, no macOS Mojave, eu precisava executar brew reinstalar o openssl e depois pip install pycurl == 7.43.0.1 --install-option = - with-openssl --install-option = - openssl-dir = / usr / local / opt / openssl
user495732 Why Me
2

Isso funcionou para mim:

pip install --compile --install-option = "- with-openssl" pycurl

user10148784
fonte
2

Tentei de tudo aqui no macOS 10.13 sem sucesso. Então encontrei https://gist.github.com/webinista/b4b6a4cf8f158431b2c5134630c2cbfe que funcionou:

brew install curl --with-openssl
pip uninstall pycurl
export PYCURL_SSL_LIBRARY=openssl
export LDFLAGS=-L/usr/local/opt/openssl/lib;export CPPFLAGS=-I/usr/local/opt/openssl/include; pip install pycurl --compile --no-cache-dir

Isso funcionou para mim quando não estava usando um virtualenv e dentro de um virtualenv.

Daryl Spitzer
fonte
1

Não tenho certeza se é por causa da execução em um virtualenv, mas no CentOS 7 essas soluções não estavam funcionando para mim; os objetos compilados ainda estavam sendo obtidos do diretório de cache quando eu estava reinstalando. Se você tiver o mesmo problema depois de tentar outras soluções aqui, tente o seguinte:

pip uninstall pycurl
export PYCURL_SSL_LIBRARY=[nss|openssl|ssl|gnutls]
pip install pycurl --no-cache-dir
Robert Kelly
fonte
O mesmo aqui, no CentOS 7 não estava funcionando até que eu adicionei a --no-cahe-diropção. Só quero mencionar ainda que ele só conseguiu rodar sob root su -como @alfonso sugeriu. Fazer sudo pip3 ...não era bom o suficiente. Provavelmente necessário para que a variável de ambiente seja selecionada.
Nagev,
1

Erro:

ImportError: pycurl: libcurl backend ssl de tempo de link (openssl) é diferente de backend ssl de tempo de compilação (nenhum / outro)

Isso funcionou para mim, Mac 10.13, python 3.5, importação de pycurl funcionou depois de instalar assim

pip3 uninstall pycurl;

pip3 install --compile --install-option="--with-openssl" pycurl
Vairav
fonte
Isso funcionou para mim também no Python 2.7.10 no High Sierra.
Skyler
1

Depois de ficar preso nisso por um longo tempo, descobri que a apple parou de incluir cabeçalhos OpenSSL desde o OS X 10.11 El Capitan. como consertar?

1) brew install openssl

2) echo 'export PATH="/usr/local/opt/openssl/bin:$PATH"' >> ~/.bash_profile (or .zshrc for zsh, etc)

3) pip uninstall pycurl

4) pip install --install-option="--with-openssl" --install-option="--openssl-dir=/usr/local/opt/openssl" pycurl
Urso polar
fonte
Com certeza, levei muito tempo para fazer funcionar, muito chato, devo dizer. Diverta-se!!
Whitebear
1

Mesmo problema no amazonlinux - resolvido
, tive esse problema ao criar uma imagem docker baseada no amazonlinux, instalar o python3.7 e adicionar o módulo pycurl. Todos os outros módulos python foram instalados corretamente, exceto pycurl. Depois de tentar muitas das soluções propostas nos tópicos ligados a este problema, finalmente resolvi meu problema usando os seguintes comandos para instalação de todas as peças.
yum -y install python3 python3-devel gcc libcurl-devel aws-cli openssl-static.x86_64
em seguida, instalei outros módulos, como psycopg2-binary, requests, certifi usando:
pip3 install --user --no-cache-dir -r requirements.txt

e finalmente instalei o módulo pycurl usando:

pip3 install --user --global-option="--with-openssl" --no-cache-dir pycurl
e passando aqui a opção global openssl. A instalação da biblioteca estática openssl-static.x86_64 resolveu o problema no meu caso ao usar a opção global usada pelo segundo comando pip3.

Rimetnac
fonte
0

Para python 2.7

sudo apt-get install build-essential libssl-dev libffi-dev python-dev

Para python 3.5 também instale o seguinte:

sudo apt-get install python3.5-dev

Baixe a última fonte pycurl-7.43.0.tar.gz (md5) de pypi https://pypi.python.org/pypi/pycurl/7.43.0#downloads e execute o próximo comando:

python setup.py --with-openssl install

Além disso, você pode fazer isso no ambiente Python:

(test_env)user@pc:~/Downloads/pycurl-7.43.0$ python setup.py --with-openssl install
Andrew Nodermann
fonte
0
pip install -U pip

if [ "$(curl --version | grep NSS 2>/dev/null)" ]; then
    pip install --compile --install-option="--with-nss" pycurl
else
    pip install --compile --install-option="--with-openssl" pycurl
fi
Sanket Jagtap
fonte
0

Eu encontrei esse problema e a resposta de Sanket Jagtap funcionou para mim. Tentei responder com a maioria dos votos, mas não funcionou.

Minha versão antiga do openssl é 1.0.1t, acho que reinstalar o openssl pode resolver esse problema.

--- pycurl's openssl backend time....

Eu reconstruí o último openssl e tentei esta resposta. Veja isso.

pip install --compile --install-option="--with-openssl" pycurl

Isso funcionou para mim.

Eu recomendo que devemos reinstalar nosso openssl para tentar ..

Caído
fonte
0

Seguir funcionou para mim com Python3.6

MacOS High-Sierra

sudo pip3 uninstall pycurl
sudo pip3 install --compile --install-option="--with-openssl" pycurl 

CentOS 7

sudo pip3 uninstall pycurl
sudo pip3 install --compile --install-option="--with-nss" pycurl
Samuel
fonte
0

FWIW, encontrei muitos problemas para fazer isso funcionar por meio do AWS Elastic Beanstalk e, finalmente, consegui fazê-lo funcionar com:

packages:
  yum:
    openssl-devel: []
    libcurl-devel: []

container_commands:
  # Reinstall PyCurl with correct ssl backend
  05_reinstall_pycurl:
    command: |
      pip install --upgrade pip
      pip uninstall -y pycurl
      pip install --global-option='--with-openssl' pycurl
Sean Chon
fonte
0

Recentemente, ao atualizar um projeto Django, tive um erro semelhante. Mas desta vez a configuração da variável de ambiente não funcionou. Então eu tive que definir ambas as variáveis ​​de ambiente export PYCURL_SSL_LIBRARY=openssle passar o sinalizador --global-option="with-openssl".

A resposta original foi postada nesta página

helloworld2013
fonte
-1
export CPPFLAGS=-I/usr/local/opt/openssl/include
export LDFLAGS=-L/usr/local/opt/openssl/lib

pip install pycurl --global-option="--with-openssl"
Evgenii
fonte