web-dev-qa-db-fra.com

Erreur de backend SSL lors de l'utilisation d'OpenSSL

J'essayais d'installer pycurl dans un virtualenv en utilisant pip et j'ai eu cette erreur 

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

J'ai lu une documentation disant que "Pour résoudre ce problème, vous devez indiquer à setup.py ce que le backend SSL est utilisé"(source) bien que je ne sois pas sûr de savoir comment procéder car j'ai installé pycurl à l'aide de pip .

Comment puis-je spécifier le backend SSL lors de l'installation de pycurl avec pip?

Merci

72
helloworld2013

Après avoir lu leur fichier INSTALLATION, j’ai pu résoudre mon problème en définissant une variable d’environnement et en effectuant une réinstallation

  • supprimer l'installation pycurl existante 

    pip uninstall pycurl

  • variable d'exportation avec votre backend ssl back-time (qui est openssl ci-dessus)

    export PYCURL_SSL_LIBRARY=openssl

  • puis, réinstallez pycurl

    pip install pycurl

Il pourrait y avoir une autre solution, mais cela fonctionne parfaitement pour moi sur une installation virtualenv et pip.

100
helloworld2013

la réponse de helloworld2013 est correcte, mais la clé correspond à la bibliothèque SSL attendue par pycurl. L'erreur sera quelque chose comme:

pycurl: le backend ssl de libcurl link-time (<bibliothèque>) est différent du backend ssl de compilation (<bibliothèque> ou "aucun/autre")

Pour résoudre ce problème, vous devez utiliser la bibliothèque attendue par pycurl. Dans mon cas, mon erreur était "pycurl: le backend ssl de libcurl link-time ( nss ) est différent de celui de ssl au moment de la compilation (openssl)";

pip uninstall pycurl
export PYCURL_SSL_LIBRARY=nss
pip install pycurl
68
DrStrangepork

Avec OSX 10.13, un openSSL installé par brassage, et virtualenv, j’ai réussi à:

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
42
Michael Wilson

Avec le pip 7.1, vous pouvez mettre les éléments suivants dans votre fichier d’exigences:

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

Il suffit de remplacer nss par la bibliothèque de back-end ssl appropriée.

23
maharg101

Cela a fonctionné pour moi:

pip uninstall pycurl
export PYCURL_SSL_LIBRARY=nss
easy_install pycurl

Rien de tout cela n'a fonctionné pour moi (notez que la différence est simplement 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
19
JoelBondurant

La méthode pour réparer le pycurl après la mise à jour Mac OS High Sierra:

  1. Réinstallez les bibliothèques Curl pour qu'elles utilisent OpenSSL au lieu de SecureTransport

    brew install curl --with-openssl
    
  2. Installez pycurl avec un environnement et des chemins d'accès corrects

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

Je suis sur CentOS 7. J'ai essayé tout ce qui précède et je ne pouvais rien faire fonctionner. Il s'avère que j'avais besoin de les exécuter en tant qu'utilisateur root. Donc, si vous rencontrez des problèmes, essayez l’une des solutions ci-dessus en tant qu’utilisateur root. Par exemple, voici ce qui a fonctionné pour moi:

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

Bien entendu, toutes les clauses de non-responsabilité habituelles relatives à l'exécution en tant qu'utilisateur root s'appliquent.

Remarque: [nss | openssl | ssl | gnutls] dans le code ci-dessus signifie en choisir un et n'inclut pas les crochets ni les tuyaux. La personne qui a posé la question initiale aurait choisi openssl. Dans mon cas particulier, j'ai choisi nss. Votre message d'erreur devrait vous indiquer le choix à faire.

7
alfonso

J'ai eu ce problème pendant des jours. Enfin, avec l'aide d'autres réponses ici (principalement celles d'Alexander Tyapkov), je les ai obtenues pour AWS Elastic Beanstalk.

Installation manuelle (connexion avec 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"

IMPORTANT: Veuillez noter que vous devez vous assurer d'utiliser la version actuelle de Python et PIP, sinon vous pourriez le compiler pour Python 2.x et utiliser v3.x.

Installation automatique dans 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'

J'ai eu ce problème parce que j'essayais de configurer Celery 4 avec Django 1.10 dans Elastic Beanstalk. Si c'est votre cas, j'ai écrit un article de blog complet à ce sujet .

6
Diego Jancic

Vous pouvez télécharger le fichier tar.gz à partir de ici . Puis extrayez-le dans un dossier. Vous trouverez un fichier setup.py ici. Exécutez la commande là-bas mentionnée par le site. Par exemple:

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

FYI: J'ai essayé d'installer pycurl à mes fenêtres, mais je n'ai pas pu Mais l'a fait sur mon linux.

5
Sabuj Hassan

J'exécute ceci sur OS X et certaines des solutions ci-dessus ne fonctionnaient pas. Semblable à commentaire d'Edward Newell } _, la variable PYCURL_SSL_LIBRARY semblait avoir été complètement ignorée.
Une lecture plus approfondie de la documentation d'installation de PycURL a révélé les éléments suivants: 

pip peut réinstaller le paquet déjà compilé au lieu de recompiler pycurl avec les nouvelles options spécifiées

Par conséquent, je devais le forcer à compiler avec: 

pip install --compile pycurl 

Cela fonctionne dans un certain nombre de cas. Cependant, j'ai rencontré quelques systèmes qui ont continué à ignorer la variable. Ainsi, comme réponse de maharg101 , j'ai eu recours aux options d'installation qui peuvent être définies via pip: 

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

où vous sélectionnez l'une des trois options entre crochets. Notez que l'option disponible est ssl et notopenssl. Si vous spécifiez --with-openssl, vous obtiendrez une erreur. Notez également que si vous manipulez la variable PYCURL_SSL_LIBRARY et que vous la basculez sur des valeurs géniales pour voir ce qui se produira, cette dernière commande l’attrapera et générera une erreur si la valeur est définie mais non valide.

4
Gunga

Réinstallation de curl

J'ai essayé toutes les suggestions de cette discussion mais personne n'a travaillé pour moi. Comme solution, j'ai réinstallé curl et curlib. Après cela, j'ai pu installer pycurl avec le support ssl dans l'environnement.

Au début:

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

Part 1.Re/Installation with pip

Tout d’abord, j’ai retiré pycurl de virtualenv en utilisant pip, comme suggéré précédemment:

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

L'idée ici est que ce paquet a été mis en cache et que nous venons de le réinstaller avec l'option openssl. 

J'ai aussi essayé de recompiler pycurl avec pip en utilisant:

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

..mais a eu la même erreur après avoir exécuté:

python
import pycurl
pycurl.version

ImportError: pycurl: le backend ssl de libcurl link-time ( gnutls ) est différent du serveur ssl au moment de la compilation ( openssl )

Partie 2. Installation à partir de tar

Après que la méthode précédente n'ait pas fonctionné, j'ai décidé d'installer pycurl à partir de tar avec:

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

Il a installé pycurl globalement mais pas dans virtualenv. Je n'ai pas non plus vérifié s'il était installé avec le support SSL ou non, mais je pense toujours sans ssl.

Partie 3. Réinstallation de curl et curllib

Enfin, j'ai compris que pycurl ne s'installe pas normalement dans l'environnement car Global curl et libcurl sont compilés avec gnutls.

Avant de commencer, vérifiez avec:

curl-config --configure

Une des lignes de sortie sera

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

Pour le recompiler:

Tout d'abord enlever curl:

Sudo apt-get purge curl

Installer toutes les dépendances de construction nécessaires pour curl

Sudo apt-get build-dep curl

Obtenir les dernières nouvelles (au 20 décembre 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

Les étapes habituelles pour créer une application à partir des sources

./configure
./make
 Sudo make install

Si openssl est installé correctement, configure le trouvera automatiquement. La sortie sera:

version curl: 7.51.0
Configuration de l'hôte: x86_64-pc-linux-gnu
Préfixe d'installation:/usr/local
Compilateur: gcc
Prise en charge de SSL: enabled (OpenSSL) ...

Résolvez tous les problèmes de caches d'emplacement de lib de niveau C ("cache de bibliothèque partagée")

Sudo ldconfig

Maintenant, essayez de réinstaller pycurl dans l’environnement:

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"

Le résultat devrait être:

python
import pycurl
pycurl.version

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

2
Alexander Tyapkov

Cela a fonctionné pour moi: 

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

1
user10148784

Erreur: 

ImportError: pycurl: le backend ssl de libcurl au moment des liens est différent du backend ssl au moment de la compilation (aucun/autre)

Cela a fonctionné pour moi, Mac 10.13, python 3.5, l’importation pycurl a fonctionné après l’installation de cette manière

pip3 uninstall pycurl;

pip3 install --compile --install-option="--with-openssl" pycurl
1
vairav

Après avoir été bloqué pendant longtemps, j'ai découvert qu'Apple avait cessé d'inclure les en-têtes OpenSSL depuis OS X 10.11 El Capitan.

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

J'ai tout essayé sur macOS 10.13 sans succès. Puis j'ai trouvé https://Gist.github.com/webinista/b4b6a4cf8f158431b2c5134630c2cbfe qui a fonctionné:

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

Cela a fonctionné pour moi à la fois lorsque je n'utilise pas virtualenv et dans un virtualenv.

1
Daryl Spitzer

Je ne suis pas sûr que ce soit à cause de l’utilisation de virtualenv, mais sous CentOS 7, ces solutions ne fonctionnaient pas pour moi; les objets compilés étaient toujours en cours d’extraction dans le répertoire de cache lors de la réinstallation. Si vous rencontrez le même problème après avoir essayé d'autres solutions, essayez les solutions suivantes:

pip uninstall pycurl
export PYCURL_SSL_LIBRARY=[nss|openssl|ssl|gnutls]
pip install pycurl --no-cache-dir
1
Robert Kelly

Pour tous ceux qui ont un problème avec PyCharm CE sur macOS Mojave, voici comment je l'ai obtenu:

  • spécifier la version: 7.43.0.1
  • Options: --install-option = - with-openssl --install-option = - openssl-dir =/usr/local/opt/openssl

 PyCharm Project Interpreter screen shot

1
fabe

J'ai rencontré ce problème et la réponse de Sanket Jagtap a fonctionné pour moi. J'ai essayé la réponse avec le plus de votes, mais cela n'a pas fonctionné.

L’ancienne version d’openssl est 1.0.1t. Je pense que la réinstallation d’openssl pourrait résoudre ce problème.

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

J'ai reconstruit le dernier openssl et essayé this answer. Regarde ça.

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

Cela a fonctionné pour moi.

je recommande que nous devrions réinstaller notre openssl pour essayer ..

0
F.allen
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
0
Sanket Jagtap

Ce lien résume la raison pour laquelle les erreurs se produisent et donne une instruction claire pour résoudre le problème.

https://cscheng.info/2018/01/26/installing-pycurl-on-macos-high-sierra.html

Pour moi, le problème est survenu lorsque je suis passé de El Captain à High-Sierra.

0
hyukkyulee

Pour python 2.7

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

Pour Python 3.5, installez également le suivant:

Sudo apt-get install python3.5-dev

Téléchargez la dernière version de pycurl-7.43.0.tar.gz (md5) Source depuis pypi https://pypi.python.org/pypi/pycurl/7.43.0#downloads Et exécutez la commande suivante:

python setup.py --with-openssl install

Aussi, vous pouvez le faire dans un environnement python:

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

Après travaillé pour moi avec 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
0
Samuel