pycurl.error: (35, 'gnutls_handshake () falhou: o handshake falhou')

1

Ao tentar fazer o download de uma URL https:// com PycURL 'PycURL/7.19.3 libcurl/7.35.0 GnuTLS/2.12.23 zlib/1.2.8 libidn/1.28 librtmp/2.3' no Python 2.7 no Ubuntu 14.04.2, recebo

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

curl , no entanto, funciona bem, talvez devido ao fato de estar usando 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

Então, eu preferiria uma ligação PycURL a openssl também. Eu tentei reinstalar o python-pycurl com

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

como é frequentemente recomendado em questões semelhantes, mas ainda pycurl não está vinculado a openssl . Mesmo com apt-get remove e easy_install etc.

Pergunta: Como obter um PycURL com openssl de ligação?

Bonus-question: Por que o PycURL não é instalado com openssl imediatamente, porque a ligação do GnuTLS parece não funcionar?

    
por flaschbier 28.08.2015 / 07:25

1 resposta

2

Eu estava sinceramente esperando que isso pudesse ser resolvido sem seguir algumas instruções que eu dificilmente entendo e compilando as coisas e assim por diante. Mas infelizmente ...

Veja este resumo de 2014 para obter instruções.

No momento da escrita, usando o Ubuntu Trusty 14.04.2 LTS, as versões ainda são as mesmas, ou seja, 7.19.3 , então as instruções no Gist podem ser seguidas uma a uma. A verificação do local estava ok e a ondulação ainda está funcionando com https:// . Depois de percorrer a receita, pycurl.version mostra

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

Para automatizar o download, o patch e a compilação, você vai adorar este pequeno 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 ---  --- $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."

Há esperança, no entanto, que uma versão mais recente 7.19.5 chegue aos repositórios, que é suposto ter os problemas corrigidos no GnuTLS para que o PycURL comece a trabalhar fora da caixa. Ainda permanece a questão: por que esse problema está nos repositórios desde 2009 e ninguém se importa ...

Problemas de atualização

Engraçado o suficiente, qualquer atualização regular subseqüente do Ubuntu do pycurl / libcurl sobrescreverá sua alteração. Então, esteja preparado para repetir isso repetidamente :(

Como alternativa, você pode colocar python-pycurl em espera após construí-la com openssl para garantir que apt-get update não a sobrescreva mais:

sudo apt-mark hold python-pycurl

As atualizações podem ser reativadas posteriormente por

sudo apt-mark unhold python-pycurl 

Receita de framboesa

O script acima funciona bem em Raspberry Pi com Raspbian Wheezy também, quando você adiciona a capacidade de instalar fontes antes por

sudo nano /etc/apt/sources.list

e descomentando a linha deb-src , para que o arquivo se pareça com

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

Quando as fontes não são encontradas (na etapa 4), talvez seja necessário fazer uma

sudo apt-get update

antes de executar o script acima.

Nota: No Raspberry, o processo sofre um pouco da velocidade do processador e você deve tomar meia hora (se tudo funcionar bem). E novamente, ou você coloca python-pycurl em espera ou você terá que investir essa meia hora novamente após cada atualização.

    
por flaschbier 28.08.2015 / 18:24