Error de backend SSL al usar OpenSSL

87

Estaba intentando instalar pycurl en un virtualenv usando pip y recibí este error

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

Leí algo de documentación que dice que "Para solucionar esto, necesita decirle a setup.py qué backend SSL se usa" (fuente), aunque no estoy seguro de cómo hacerlo ya que instalé pycurl usando pip.

¿Cómo puedo especificar el backend SSL al instalar pycurl con pip?

Gracias

helloworld2013
fuente
1
¿Cuál es tu sistema operativo?
Evgenii

Respuestas:

121

Después de leer su archivo de INSTALACIÓN, pude resolver mi problema configurando una variable de entorno e hice una reinstalación

  • eliminar la pycurlinstalación existente

    pip uninstall pycurl

  • exportar variable con su backend ssl de tiempo de enlace (que es openssl arriba)

    export PYCURL_SSL_LIBRARY=openssl

  • a continuación, volver a instalar pycurlcon ningún caché

    pip install pycurl --no-cache-dir

No puede haber otra solución por ahí, pero esto funciona perfectamente para mí en un virtualenve pipinstalación.

helloworld2013
fuente
2
Gracias, PYCURL_SSL_LIBRARY=opensslfunciona perfectamente!
thnee
Para usuarios de mac os x : no recuerde usar en set -x PYCURL_SSL_LIBRARY openssllugar de export PYCURL_SSL_LIBRARY=opensslsi usa la consola fish en lugar de bash .
Serge
13
pip install pycurl --no-cache-dir
Shuguang Yang
Gracias. He analizado varias posibles soluciones a este problema. Esta solución funcionó la primera vez.
Matt Setter
paso a paso ejemplo de instalación de virtualenv yippeecode.com/view-code/343QWQT144/…
helloworld2013
77

La respuesta de helloworld2013 es correcta, pero la clave coincide con la biblioteca SSL que espera pycurl. El error será algo como:

pycurl: libcurl link-time ssl backend ( <library> ) es diferente del backend ssl en tiempo de compilación ( <library> o " ninguno / otro ")

Para solucionarlo, debe usar la biblioteca que espera pycurl. En mi caso, mi error fue " pycurl: libcurl link-time ssl backend ( nss ) es diferente del backend ssl en tiempo de compilación (openssl) ", así que mi solución fue:

pip uninstall pycurl
export PYCURL_SSL_LIBRARY=nss
pip install pycurl
DrStrangepork
fuente
1
Brillante. Esto debería obtener más votos. La respuesta original se aplicó a algunas máquinas. Esta es una forma más general de solucionarlo dependiendo de su plataforma.
Nishant
6
hmm esto no funcionó para mí en una Mac. Parece que PYCURL_SSL_LIBRARYestá siendo ignorado por completo. El backend ssl en tiempo de compilación es siempre "(ninguno / otro)" para mí, aunque echo PYCURL_SSL_LIBRARYda openssl.
Edward Newell
1
como @EdwardNewell, esta solución no funcionó para mí en Scientific Linux (Rhel), aunque sí especifiqué nss para PYCURL_SSL_LIBRARY, el backend permanece (ninguno / otro)
Yondaime008
3
En Mac pycurlpip 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
eliminé
2
Esto funcionó, pero solo con las siguientes opciones: pip install pycurl --compile --no-cache-diren CentOS 7.3.
Robert Yi
51

Con OSX 10.13, un openSSL instalado en brebaje y virtualenv, tuve éxito con:

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
fuente
4
Sí, en MacOS 10.13.1 (High Sierra), ¡eso hizo el truco! ¡Muchas gracias! Para reinstalar openssl:brew reinstall openssl
Denis Arnaud
1
Solucioné mi problema con él. Gracias :)
JeongjinKim
1
¡Se solucionó el problema en Mac OSX 10.13.4! Gracias.
user1192748
1
¡Gracias! También solucionó mi problema. Mac OSX 10.13.4
Steven Church
2
¡Daryl siento oír eso! Me funcionó de nuevo en Mojave, así que no estoy seguro de qué pasa.
Michael Wilson
25

Con pip 7.1 puede poner lo siguiente en su archivo de requisitos:

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

Simplemente reemplace nss con la biblioteca de backend ssl relevante.

maharg101
fuente
1
Esta solución es mejor que exportar una var y reinstalar porque se puede compartir en el archivo requirements.txt y no tiene que repetirse por usuario.
dfarrell07
1
exportar no funcionó para mí en CentOS 7. Pero configurar la opción global sí lo hizo. ¡Gracias!
Aaron Nguyen
Tuve que combinar su solución y la de @Michael Wilson para que funcionara en macOS. Parece un problema de criptografía; algo de discusión aquí: github.com/pyca/cryptography/issues/3489
kip2
20

El método para reparar el pycurl después de la actualización de Mac OS High Sierra:

  1. Reinstale las bibliotecas de curl para usar OpenSSL en lugar de SecureTransport

    brew install curl --with-openssl
    
  2. Instale pycurl con las rutas y el entorno de tiempo de compilación correctos

    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
fuente
2
Trabajó para mí en High Sierra (usando un virtualenv).
djangoat
1
¡Si! También ver este artículo cscheng.info/2018/01/26/...
somecallitblues
Me funcionó en High Sierra (usando un virtualenv) pero tuve que eliminar la marca --user
user495732 Why Me
¡¡Muchas gracias!! Eso fue increíblemente útil. Ejecutando High Sierra y pasando un par de horas en él, esta es la única solución que funcionó :)
Alessandro
Cuando usé la --userbandera como arriba, obtuve:Can not perform a '--user' install. User site-packages are not visible in this virtualenv.
Daryl Spitzer
19

Esto funcionó para mí:

pip uninstall pycurl
export PYCURL_SSL_LIBRARY=nss
easy_install pycurl

Nada de esto funcionó para mí (tenga en cuenta que la diferencia es simplemente 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
fuente
1
La easy_installopción fue la única que funcionó. No entiendo por qué esto es tan complicado. Yo necesitaba export PYCURL_SSL_LIBRARY=openssl. Mi uno informó "ninguno / otro" para la biblioteca compilada.
CMCDragonkai
Me encontré con este problema y esta solución fue la única que funcionó para mí.
Boudewijn Aasman
2
En mi experiencia, pip no elimina por completo la versión anterior de pucurl que se instaló con el sistema operativo (Centos7.2 en mi caso). Pip no tocó los archivos /usr/lib64/python2.7/site-packages/pycurl.so ni egg-info de la versión anterior. Easy_install, por otro lado, los borró además de colocar pycurl egg en los paquetes del sitio.
sokhaty
Uf, intenté todo lo anterior y no funcionó. Esto funcionó para mí cuando mi mensaje de error original era `` ImportError: pycurl: libcurl link-time ssl backend (openssl) is different from compile-time ssl backend (none / other) ''
James McCormac
10

Tuve este problema durante días. Finalmente, con la ayuda de otras respuestas aquí (principalmente de Alexander Tyapkov), lo hice funcionar para AWS Elastic Beanstalk.

Instalación manual (conexión con 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: tenga en cuenta que debe asegurarse de estar utilizando la versión actual de Python y PIP; de lo contrario, es posible que lo esté compilando para Python 2.xy utilizando v3.x.

Instalar automáticamente en 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'

Tuve este problema porque estaba intentando configurar Celery 4 con Django 1.10 en Elastic Beanstalk. Si ese es tu caso, escribí una publicación de blog completa al respecto .

Diego Jancic
fuente
ugh gracias. esto puede ser molesto, especialmente porque los archivos de configuración de eb parecen muy volubles y nunca le dan errores razonables (incluidos los problemas de formato)
Ian
Voté esta respuesta porque me ayudó mucho a resolver un problema similar al instalar pycurl en AWS: stackoverflow.com/questions/51019622/…
Greg Holst
8

Estoy en CentOS 7. Intenté todo lo anterior y no pude hacer que nada funcionara. Resulta que necesitaba ejecutarlos como usuario root. Entonces, si tiene problemas, pruebe cualquiera de las soluciones anteriores como usuario root. Como ejemplo, esto es lo que funcionó para mí:

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

Por supuesto, se aplican todas las exenciones de responsabilidad habituales sobre la ejecución como usuario root.

Nota: [nss | openssl | ssl | gnutls] en el código anterior significa elegir uno, y no incluir los corchetes o barras. La persona que hizo la pregunta original habría elegido openssl. En mi caso particular, elegí nss. Su mensaje de error debería indicarle qué elección tomar.

Edición de 2019: Hacer un sudo pip installpodría causar un problema con la instalación del sistema de la máquina de Python. Quizás intente trabajar en un entorno virtual de Python e instale los paquetes allí. Si eso no funciona, el truco de sudo en mi respuesta es probablemente una de las últimas opciones a considerar.

alfonso
fuente
5

Puede descargar el archivo tar.gz desde aquí . Luego extráigalo en una carpeta. Allí encontrará un archivo setup.py. Ejecute el comando allí que mencionó el sitio. Por ejemplo:

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

FYI: Intenté instalar pycurl en mis ventanas, pero no pude. Pero lo hice en mi linux.

Sabuj Hassan
fuente
gracias por la respuesta, pero esto solo podría funcionar para mí si no estoy haciendo la instalación a través de un virtualenv y pip
helloworld2013
@Sabuj para instalar pycurl en Windows, use uno de los instaladores que se proporcionan en este excelente sitio web: lfd.uci.edu/~gohlke/pythonlibs/#pycurl
Adam
4

Estoy ejecutando esto en OS X y algunas de las soluciones anteriores no funcionaban. Al igual que en el comentario de Edward Newell, la PYCURL_SSL_LIBRARYvariable parecía haber sido completamente ignorada.
La lectura adicional del documento de instalación de PycURL reveló lo siguiente:

pip puede reinstalar el paquete que ha compilado previamente en lugar de volver a compilar pycurl con las opciones recién especificadas

Por lo tanto, tuve que forzarlo a compilar con:

pip install --compile pycurl

Eso funciona en varios casos. Sin embargo, me encontré con algunos sistemas que continuaron ignorando la variable, así que, de manera similar a la respuesta de maharg101 , recurrí a las opciones de instalación que a través de pip se pueden configurar así:

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

donde selecciona una de las tres opciones dentro de los corchetes. Tenga en cuenta que la opción disponible es ssly no openssl . Si especifica --with-openssl, obtendrá un error. También tenga en cuenta que si estuviera jugando con la PYCURL_SSL_LIBRARYvariable y la cambiara a valores funky para ver qué sucedería, este último comando definitivamente la detectará y arrojará un error si el valor está establecido pero no es válido.

Gunga
fuente
1
desinstale pycurl primero, y pip install pycurl --global-option="--with-nss"funciona para mí. Para que conste, mi error esImportError: pycurl: libcurl link-time ssl backend (nss) is different from compile-time ssl backend (openssl)
ahyong
Gracias @ahyong, el truco de la opción global funcionó para mí, aunque lo intenté mientras instalaba desde tar, funcionó con pip pero no con setup.py raro ...
Yondaime008
4

Reinstalación de rizo

Probé todas las sugerencias de esta discusión, pero ninguna funcionó para mí. Como solución, he reinstalado curl y curlib. Después de eso, pude instalar pycurl con soporte ssl dentro del entorno.

Al principio:

'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 / Instalación con pip

En primer lugar, eliminé pycurl de virtualenv usando pip como se sugirió en las respuestas anteriores:

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

La idea aquí es que el paquete se almacenó en caché y simplemente lo reinstalamos con la opción openssl.

También intenté recompilar pycurl con pip usando:

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

..pero tuvo el mismo error después de ejecutar:

python
import pycurl
pycurl.version

ImportError: pycurl: libcurl link-time ssl backend ( gnutls ) es diferente del backend ssl en tiempo de compilación ( openssl )

Parte 2. Instalación desde alquitrán

Después de que el método anterior no funcionó, decidí instalar pycurl desde tar con:

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

Ha instalado pycurl globalmente pero no dentro de virtualenv. Tampoco verifiqué si estaba instalado con soporte SSL o no, pero creo que todavía sin ssl.

Parte 3. Reinstalación de curl y curllib

Finalmente entendí que pycurl no se instala normalmente en el entorno porque global curl y libcurl se compilan con gnutls.

Antes de empezar compruébalo con:

curl-config --configure

Una de las líneas de salida será

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

Para recompilarlo:

En primer lugar, elimine el rizo:

sudo apt-get purge curl

Instale las dependencias de compilación necesarias para curl

sudo apt-get build-dep curl

Obtenga la última versión (a partir del 20 de diciembre de 2016) libcurl

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

Los pasos habituales para crear una aplicación desde la fuente

./configure
./make
 sudo make install

Si openssl se instaló correctamente, configure lo encontrará automáticamente. La salida será:

versión curl: 7.51.0
Configuración del host: x86_64-pc-linux-gnu
Prefijo de instalación: / usr / local
Compilador: gcc
Soporte SSL: habilitado (OpenSSL) ...

Resolver cualquier problema de cachés de ubicación de bibliotecas de nivel C ("caché de biblioteca compartida")

sudo ldconfig

Ahora intente reinstalar pycurl dentro del entorno:

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"

El resultado debería 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
fuente
3

Para cualquiera que tenga problemas dentro de PyCharm CE en macOS Mojave, así es como lo hice funcionar en venv:

  • especificar versión: 7.43.0.1
  • Opciones: --install-option = - with-openssl --install-option = - openssl-dir = / usr / local / opt / openssl

Captura de pantalla de PyCharm Project Interpreter

fabe
fuente
1
Para mí en macOS Mojave, necesitaba ejecutar brew reinstall openssl y luego pip install pycurl == 7.43.0.1 --install-option = - with-openssl --install-option = - openssl-dir = / usr / local / opt / openssl
user495732 Why Me
2

Esto funcionó para mí:

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

usuario10148784
fuente
2

Intenté todo aquí en macOS 10.13 sin éxito. Luego encontré https://gist.github.com/webinista/b4b6a4cf8f158431b2c5134630c2cbfe que funcionó:

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

Esto funcionó para mí tanto cuando no usaba un virtualenv como dentro de un virtualenv.

Daryl Spitzer
fuente
1

No estoy seguro si esto se debe a que se ejecuta en un virtualenv, pero en CentOS 7 estas soluciones no me funcionaban; los objetos compilados todavía se estaban tomando del directorio de caché cuando estaba reinstalando. Si se encuentra con el mismo problema después de probar otras soluciones aquí, intente lo siguiente:

pip uninstall pycurl
export PYCURL_SSL_LIBRARY=[nss|openssl|ssl|gnutls]
pip install pycurl --no-cache-dir
Robert Kelly
fuente
Lo mismo aquí, en CentOS 7 no funcionaba hasta que agregué la --no-cahe-diropción. Solo quiero mencionar que solo se su -ejecutó correctamente bajo root como sugirió @alfonso. Hacerlo sudo pip3 ...no era lo suficientemente bueno. Probablemente necesario para que se recoja la variable de entorno.
Nagev
1

Error:

ImportError: pycurl: libcurl link-time ssl backend (openssl) es diferente del backend ssl en tiempo de compilación (ninguno / otro)

Esto funcionó para mí, Mac 10.13, python 3.5, la importación de pycurl funcionó después de instalar así

pip3 uninstall pycurl;

pip3 install --compile --install-option="--with-openssl" pycurl
vairav
fuente
Esto funcionó para mí también en Python 2.7.10 en High Sierra.
skyler
1

Después de estar atascado en esto durante mucho tiempo, descubrí que Apple dejó de incluir encabezados OpenSSL desde OS X 10.11 El Capitan. ¿como arreglar?

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
Oso blanco
fuente
Por supuesto, me tomó mucho tiempo hacerlo funcionar, bastante molesto, debo decir. ¡¡Que te diviertas!!
Whitebear
1

El mismo problema en amazonlinux - resuelto
Tuve este problema mientras creaba una imagen de Docker basada en amazonlinux, instalaba python3.7 y agregaba el módulo pycurl. Todos los demás módulos de Python se instalaron correctamente, excepto pycurl. Después de probar muchas de las soluciones propuestas en los hilos vinculados a este problema, finalmente resolví mi problema usando los siguientes comandos para la instalación de todas las piezas.
yum -y install python3 python3-devel gcc libcurl-devel aws-cli openssl-static.x86_64
luego instaló otros módulos como psycopg2-binary, solicitudes, certifi usando:
pip3 install --user --no-cache-dir -r requirements.txt

y finalmente instalé el módulo pycurl usando:

pip3 install --user --global-option="--with-openssl" --no-cache-dir pycurl
y pasando aquí la opción global openssl. La instalación de la biblioteca estática openssl-static.x86_64 resolvió el problema en mi caso al usar la opción global utilizada por el segundo comando pip3.

rimetnac
fuente
0

Para python 2.7

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

Para python 3.5 también instale lo siguiente:

sudo apt-get install python3.5-dev

Descargue la última fuente de pycurl-7.43.0.tar.gz (md5) de pypi https://pypi.python.org/pypi/pycurl/7.43.0#downloads y ejecute el siguiente comando:

python setup.py --with-openssl install

También puedes hacerlo en el entorno de Python:

(test_env)user@pc:~/Downloads/pycurl-7.43.0$ python setup.py --with-openssl install
Andrew Nodermann
fuente
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
fuente
0

Encontré este problema y la respuesta de Sanket Jagtap funcionó para mí. Intenté la respuesta con la mayor cantidad de votos, pero no funcionó.

Mi versión anterior de openssl es 1.0.1t, creo que reinstalar openssl puede resolver este problema.

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

Reconstruí el último openssl y probé esta respuesta. Mira esto.

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

Esto funcionó para mí.

recomiendo que deberíamos reinstalar nuestro openssl para probar ..

Caído
fuente
0

Lo siguiente funcionó para mí con 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
fuente
0

FWIW, me encontré con muchos problemas para que esto funcionara a través de AWS Elastic Beanstalk y finalmente pude hacerlo funcionar con:

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

Recientemente, al actualizar un proyecto de Django, tuve un error similar. Pero esta vez la configuración de la variable de entorno no funcionó. Así que tuve que establecer ambas variables de entorno export PYCURL_SSL_LIBRARY=openssly pasar la bandera --global-option="with-openssl".

La respuesta original se publicó en esta página.

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