2017-05-18 2 views
0

J'utilise python 2.7.6 sur ubuntuurlfetch.UrlfetchException: _ssl.c: 510: EOF a eu lieu en violation du protocole

Je reçois cette erreur lorsque j'utilise urlfetch (1.0.2) pour publier des données sur un serveur distant. Cela commence 2 jours après que le certificat SSL du serveur a été mis à jour.

Des problèmes similaires ont été signalés à un autre paquet python request. La solution consiste à mettre à jour certaines dépendances en exécutant

pip install --force-reinstall requests[security] 

mais je n'a cette

Requirement already satisfied: requests[security] in /usr/lib/python2.7/dist-packages 
    requests 2.2.1 does not provide the extra 'security' 

Rien ne semble être téléchargé et installé.

Certains poste suggère qu'il est lié à chiffrer (https://github.com/kennethreitz/requests/issues/3608#issuecomment-250681069)

openssl s_client -connect www.example.com:443 
CONNECTED(00000003) 
140353237063328:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:177: 
--- 
no peer certificate available 
--- 
No client certificate CA names sent 
--- 
SSL handshake has read 0 bytes and written 305 bytes 
--- 
New, (NONE), Cipher is (NONE) 
Secure Renegotiation IS NOT supported 
Compression: NONE 
Expansion: NONE 
--- 

-t-il l'air normal? Est-ce que je peux faire quelque chose pour le réparer?

Le serveur cible vit sur Google App Engine. Le nouveau certificat SSL ne prend pas en charge vip.

Ubuntu version info:

NAME="Ubuntu" 
VERSION="14.04.2 LTS, Trusty Tahr" 
ID=ubuntu 
ID_LIKE=debian 
PRETTY_NAME="Ubuntu 14.04.2 LTS" 
VERSION_ID="14.04" 
HOME_URL="http://www.ubuntu.com/" 
SUPPORT_URL="http://help.ubuntu.com/" 
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/" 

Répondre

1

Mon premier choix était d'utiliser this answer pour résoudre le problème par le singe-patcher ssl.py.

import ssl 
from functools import wraps 
def sslwrap(func): 
    @wraps(func) 
    def bar(*args, **kw): 
     kw['ssl_version'] = ssl.PROTOCOL_TLSv1 
     return func(*args, **kw) 
    return bar 

ssl.wrap_socket = sslwrap(ssl.wrap_socket) 

Cependant, cela n'a pas fonctionné. À la fin, je trouve que je peux le résoudre en mettant à jour Python à 2.7.13 de la source. Voici les étapes:

1) Installer la dépendance python dev

sudo apt-get install -y \ 
autotools-dev  \ 
blt-dev   \ 
bzip2    \ 
dpkg-dev   \ 
g++-multilib  \ 
gcc-multilib  \ 
libbluetooth-dev \ 
libbz2-dev   \ 
libexpat1-dev  \ 
libffi-dev   \ 
libffi6   \ 
libffi6-dbg  \ 
libgdbm-dev  \ 
libgpm2   \ 
libncursesw5-dev \ 
libreadline-dev \ 
libsqlite3-dev  \ 
libssl-dev   \ 
libtinfo-dev  \ 
mime-support  \ 
net-tools   \ 
netbase   \ 
python-crypto  \ 
python-mox3  \ 
python-pil   \ 
python-ply   \ 
quilt    \ 
tk-dev    \ 
zlib1g-dev 

2) Télécharger le code source

wget https://www.python.org/ftp/python/2.7.13/Python-2.7.13.tgz 

3) Déballez

tar xfz Python-2.7.13.tgz 

4) configurer

cd Python-2.7.13/ 
./configure --prefix /usr/local/lib/python2.7.13 --enable-ipv6 

5) construire

make 

6) deploy

sudo make install 

7) Installer pip et urlfetch et d'autres dépendances

+0

Vous pouvez également essayer d'utiliser pyenv ou pythonz pour installer de nouveaux pythons. – duyue

2

Cette erreur se produit sur les anciennes versions de Python, qui ne prennent pas en charge l'extension TLS SNI (Server Name Indication). Vous devez utiliser SNI pour vous connecter aux sites hébergés sur App Engine avec HTTPS. Il semble que le support de SNI soit présent dans Python 2.7.9 et plus tard.

Si vous effectuez des demandes de une app App Engine écrit en Python et ont besoin d'un soutien SNI, vous devez reference version 2.7.11 of the ssl library in your app.yaml file ou vous allez rencontrer ce même problème.