web-dev-qa-db-fra.com

pycurl.error: (35, 'gnutls_handshake () a échoué: la négociation a échoué')

En essayant de télécharger à partir d'un https:// URL avec PycURL 'PycURL/7.19.3 libcurl/7.35.0 GnuTLS/2.12.23 zlib/1.2.8 libidn/1.28 librtmp/2.3' dans Python 2.7 sur Ubuntu 14.04.2, je reçois

pycurl.error: (35, 'gnutls_handshake() failed: Handshake failed')

curl fonctionne cependant très bien, peut-être parce qu'il utilise openssl:

$ curl --version
curl 7.35.0 (x86_64-pc-linux-gnu) libcurl/7.35.0 OpenSSL/1.0.1f zlib/1.2.8 libidn/1.28 librtmp/2.3

Je préférerais donc une liaison PycURL à openssl aussi. J'ai essayé de réinstaller python-pycurl avec

export PYCURL_SSL_LIBRARY=openssl
Sudo apt-get remove python-pycurl
Sudo apt-get install python-pycurl

comme souvent sur des questions similaires, mais pycurl n’est pas lié à openssl. Idem avec apt-get remove et easy_install etc.

Question: Comment obtenir un PycURL avec openssl contraignant?

Question bonus: Pourquoi PycURL n'est-il pas installé avec la liaison openssl, car la liaison GnuTLS ne semble pas fonctionner de toute façon?

1
flaschbier

J'espérais sincèrement que cela pourrait être résolu sans suivre certaines instructions que je comprenais à peine et en compilant des choses et ainsi de suite. Mais malheureusement...

Voir this Gist à partir de 2014 pour les instructions.

Au moment de la rédaction de ce document, en utilisant Ubuntu Trusty 14.04.2 LTS, les versions sont toujours les mêmes, à savoir 7.19.3, de sorte que les instructions du Gist peuvent être suivies une à une. La vérification ponctuelle était correcte et Curl fonctionne toujours avec https://. Après avoir parcouru la recette, pycurl.version montre

PycURL/7.19.3 libcurl/7.35.0 OpenSSL/1.0.1f zlib/1.2.8 libidn/1.28 librtmp/2.3

Pour automatiser le téléchargement, la correction et la compilation, vous allez adorer ce petit script:

#!/bin/bash

#
#   How to rebuild PycURL against OpenSSL on Ubuntu
#   (tested for 14.04.2 now)
#
#   This script implements the great Gist by aerickson:
#   https://Gist.github.com/aerickson/f15133a7e56b2d7f27e3
#   feel free to use it anyway you like.
#   Credits go to Andrew anyway :)
#


# we will add some colored headers that make it easier to find obstacles 
# in the terminal output (which will be > 1000 lines...)
ESC="\x1b["
RESET=$ESC"39;49;00m"
RED=$ESC"31;01m"
GREEN=$ESC"32;01m"
YELLOW=$ESC"33;01m"
BLUE=$ESC"34;01m"

header() {
    echo -e "\n$YELLOW --- $1 --- $RESET\n"
}

echo -e "\n\n$GREEN"
echo -e "\
Build pycurl with openssl support\n\n\
Section numbers refer to\n\
https://Gist.github.com/aerickson/f15133a7e56b2d7f27e3
"
echo -e "$RESET\n"



# remove eventually existing pycurl
header "0. remove python-pycurl"
Sudo apt-get remove python-pycurl --yes

header "1. install build essentials"
Sudo apt-get install build-essential fakeroot dpkg-dev --yes

header "2./3. make build dir"
mkdir ~/python-pycurl-openssl
cd ~/python-pycurl-openssl

if [ ! "$HOME/python-pycurl-openssl" = `pwd` ]; then
    echo -e "\n${RED}Cannot change to working dir. WTF?${RESET}\n"
    exit 1
fi

header "4. get pycurl sources"
Sudo apt-get source python-pycurl --yes

header "5. get build dependencies for python-pycurl"
Sudo apt-get build-dep python-pycurl --yes

header "6. install libcurl with openssl"
Sudo apt-get install libcurl4-openssl-dev --yes

DIR=`find * -name 'pycurl*' -type d -print`
DSC=`find * -name '*.dsc' -type f -print`

echo
echo "DIR = $DIR"
echo "DSC = $DSC"
echo

header "7. unpack source archive"
Sudo dpkg-source -x $DSC

header "8. change to package dir"
cd $DIR

header "9. edit debian/control file"
Sudo cp debian/control ./control.gnutls
Sudo cat ./control.gnutls | sed -e 's|libcurl4-gnutls-dev|libcurl4-openssl-dev|' | Sudo tee ./control.openssl >/dev/null
Sudo cp ./control.openssl debian/control

header "10. build package"
echo "hold on..."
echo "(crashdump of nosetests is 'normal')"
Sudo PYCURL_SSL_LIBRARY=openssl dpkg-buildpackage -rfakeroot -b 2>&1 | Sudo tee ../buildlog.txt >/dev/null
echo
echo -e $BLUE
Sudo head ../buildlog.txt
echo -e $RESET
echo "   [ ... 1000+ more messages omitted ... ]"
echo -e $BLUE
Sudo tail ../buildlog.txt
echo -e $RESET
echo
echo "find more output in ~/python-pycurl-openssl/buildlog.txt:"
wc -l  ../buildlog.txt

header "11. install via package manager"
Sudo dpkg -i ../python-pycurl_*.deb

echo
echo "some other packages are available also now:"
ls ../*.deb
echo "they can be installed by 'Sudo dpkg -i ../py...' from here."

On espère cependant qu'une version plus récente 7.19.5 se rendra au dépôt, qui est supposé résoudre les problèmes dans GnuTLS afin que PycURL puisse commencer à fonctionner immédiatement. . Reste la question de savoir pourquoi ce problème est dans les pensions depuis 2009 et personne ne s'en soucie ...

Problèmes de mise à jour

Assez drôle, toute mise à jour ultérieure de pycurl/libcurl sur Ubuntu écrasera votre modification. Alors soyez prêt à répéter cela encore et encore :(

Sinon, vous pouvez mettre python-pycurl en attente après la construction avec openssl pour vous assurer que apt-get update ne sera pas écrasé. il plus:

Sudo apt-mark hold python-pycurl

Les mises à jour peuvent être réactivées plus tard par

Sudo apt-mark unhold python-pycurl 

Recette Framboise

Le script ci-dessus fonctionne bien sur Raspberry Pi avec Raspbian Wheezy également, lorsque vous ajoutez la possibilité d’installer des sources auparavant

Sudo nano /etc/apt/sources.list

et décommenter la ligne deb-src, de sorte que le fichier ressemble à

deb http://mirrordirector.raspbian.org/raspbian/ wheezy main contrib non-free rpi
# Uncomment line below then 'apt-get update' to enable 'apt-get source'
deb-src http://archive.raspbian.org/raspbian/ wheezy main contrib non-free rpi

Lorsque les sources ne sont pas trouvées (à l'étape 4), vous devrez peut-être effectuer une

Sudo apt-get update

avant d'exécuter le script ci-dessus.

Remarque: sur le Raspberry, le processus souffre un peu de la vitesse du processeur et vous devriez prendre de côté une demi-heure (si tout se passe bien). Et encore une fois, soit vous mettez en attente python-pycurl, soit vous devrez investir cette demi-heure après chaque mise à jour.

2
flaschbier