python - Error de servidor back-end SSL al usar OpenSSL
curl virtualenv (20)
Estaba tratando de 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í documentación que decía: "Para solucionar esto, debes indicar a setup.py qué back-end SSL se usa" (source) aunque no estoy seguro de cómo hacerlo desde que instalé pycurl usando pip.
¿Cómo puedo especificar el back-end SSL al instalar pycurl con pip?
Gracias
Reinstalación de curl
Probé todas las sugerencias de esta discusión, pero nadie trabajó para mí. Como solución, he reinstalado Curlib 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, he eliminado pycurl de virtualenv utilizando 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 fue almacenado en caché y simplemente lo escribimos de nuevo con la opción de openssl.
También traté de 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 tiempo de enlace ssl backend ( gnutls ) es diferente del tiempo de compilación ssl backend ( openssl )
Parte 2. Instalación del alquitrán
Después de que el método anterior no funcionó, he decidido 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 compruebo si se instaló con soporte SSL o no, pero creo que todavía sin SSL.
Parte 3. Reinstalación de curlib y curllib
Finalmente entendí que pycurl no se instala normalmente en el entorno porque global curl y libcurl se compilan con gnutls.
Antes de comenzar, verifíquelo con:
curl-config --configure
Una de las líneas de salida será
''--without-ssl'' ''--with-gnutls''
Para recompilarlo:
Primero quite el rizo:
sudo apt-get purge curl
Instale cualquier dependencia de compilación necesaria para curl
sudo apt-get build-dep curl
Obtenga la última (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 está instalado correctamente, configure lo encontrará automáticamente. El resultado será:
versión enrollable: 7.51.0
Configuración del host: x86_64-pc-linux-gnu
Instalar el prefijo: / usr / local
Compilador: gcc
Soporte SSL: habilitado (OpenSSL) ...
Resuelva cualquier problema de cach de ubicación de lib del nivel C ("caché de biblioteca compartida")
sudo ldconfig
Ahora intenta 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''
Con OSX 10.13, un openSSL instalado por brew 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
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 back-end ssl relevante.
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
Después de leer su archivo INSTALLATION, pude resolver mi problema estableciendo una variable de entorno e hice una reinstalación
eliminar la instalación de
pycurl
existentepip uninstall pycurl
exportar variable con su back-end ssl de tiempo de enlace (que es openssl arriba)
export PYCURL_SSL_LIBRARY=openssl
luego, reinstala
pycurl
pip install pycurl
Podría haber otra solución, pero esto funciona perfectamente para mí en una instalación virtualenv
y pip
.
El método para arreglar el pycurl después de la actualización de Mac OS High Sierra:
Reinstale las bibliotecas curl para usar OpenSSL en lugar de SecureTransport
brew install curl --with-openssl
Instalar Pycurl con un entorno y rutas 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
Encontré este problema y la respuesta de Sanket Jagtap funcionó para mí. Intenté la respuesta con la mayoría de los votos pero no funcionó.
Mi versión anterior de openssl es 1.0.1t, creo que la reinstalación de openssl puede resolver este problema.
--- pycurl''s openssl backend time....
Reconstruí el último openssl y probé this respuesta. Mira esto.
pip install --compile --install-option="--with-openssl" pycurl
Esto funcionó para mí.
Recomiendo que deberíamos reinstalar nuestro openssl para intentar ...
Error:
ImportError: pycurl: libcurl link-time ssl backend (openssl) es diferente del compilador ssl en tiempo de compilación (ninguno / otro)
Esto funcionó para mí, Mac 10.13, python 3.5, la importación pycurl funcionó después de instalar de esta manera
pip3 uninstall pycurl;
pip3 install --compile --install-option="--with-openssl" pycurl
Este enlace resume la razón por la cual ocurren los errores y proporciona instrucciones claras para solucionar el problema.
Para mí, el problema ocurrió cuando ascendí a High-Sierra de El Captain.
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
Estoy ejecutando esto en OS X y algunas de las soluciones anteriores no estaban funcionando. Al igual que en el comentario de Edward Newell, la variable PYCURL_SSL_LIBRARY
parece haber sido ignorada por completo.
Lectura adicional del documento de instalación PycURL reveló lo siguiente:
pip puede reinstalar el paquete que compiló previamente en lugar de volver a compilar pycurl con opciones recién especificadas
Por lo tanto, tuve que obligarlo a compilar con:
pip install --compile pycurl
Eso funciona en varios casos. Sin embargo, me encontré con algunos sistemas que seguían ignorando la variable, así que, de forma 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 ssl
y no openssl
. Si especifica --with-openssl
obtendrá un error. También tenga en cuenta que si estaba jugando con la variable PYCURL_SSL_LIBRARY
y cambiándola a valores funky para ver qué pasaría, este último comando definitivamente lo detectará y arrojará un error si el valor está establecido pero no es válido.
Estoy en CentOS 7. Intenté todo lo anterior y no conseguí que nada funcionara. Resulta que necesitaba ejecutar esto como usuario root. Por lo tanto, 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 renuncias 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 tubos. 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é opción tomar.
La respuesta de helloworld2013 es correcta, pero la clave es hacer coincidir la biblioteca SSL que pycurl está esperando. El error será algo así como:
pycurl: libcurl link-time ssl backend ( <library> ) es diferente del compilador ssl en tiempo de compilación ( <library> o " none / other ")
Para solucionarlo, debe usar la biblioteca que pycurl está esperando. En mi caso, mi error fue " pycurl: libcurl link-time ssl backend ( nss ) es diferente de ssl backend en tiempo de compilación (openssl) ", por lo que mi solución fue:
pip uninstall pycurl
export PYCURL_SSL_LIBRARY=nss
pip install pycurl
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
No estoy seguro de si esto se debe a que se ejecuta en Virtualenv, pero en CentOS 7 estas soluciones no me funcionaron; los objetos compilados seguían siendo tomados del directorio de caché cuando estaba reinstalando. Si te encuentras con el mismo problema después de probar otras soluciones aquí, prueba lo siguiente:
pip uninstall pycurl
export PYCURL_SSL_LIBRARY=[nss|openssl|ssl|gnutls]
pip install pycurl --no-cache-dir
Para Python 2.7
sudo apt-get install build-essential libssl-dev libffi-dev python-dev
Para Python 3.5 también instale el siguiente:
sudo apt-get install python3.5-dev
Descargue la última fuente 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 python:
(test_env)user@pc:~/Downloads/pycurl-7.43.0$ python setup.py --with-openssl install
Puede descargar el archivo tar.gz desde here . Luego, extráigalo en una carpeta. Encontrará un archivo setup.py allí. Ejecute el comando que el sitio menciona. Por ejemplo:
python setup.py --with-[ssl|gnutls|nss] install
FYI: Intenté instalar Pycurl en mi ventana, pero no pude. Pero lo hizo en mi Linux.
Tuve este problema por días. Finalmente, con la ayuda de otras respuestas aquí (principalmente de Alexander Tyapkov) lo conseguí trabajando para AWS Elastic Beanstalk.
Instalación manual (conectando 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, podría compilarla para Python 2.xy usar v3.x.
Instalación automática 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 Apio 4 con Django 1.10 en Elastic Beanstalk. Si ese es tu caso, escribí una publicación completa sobre el tema .
export CPPFLAGS=-I/usr/local/opt/openssl/include
export LDFLAGS=-L/usr/local/opt/openssl/lib
pip install pycurl --global-option="--with-openssl"
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