J'ai une petite application que j'ai écrite en Python et elle fonctionnait ... jusqu'à hier, quand elle a soudainement commencé à me donner une erreur dans une connexion HTTPS. Je ne me souviens pas s'il y a eu une mise à jour, mais Python 2.7.3rc2 et Python 3.2 échouent tout de même.
Je l'ai googlé et j'ai découvert que cela se produit lorsque les gens sont derrière un proxy, mais je ne le suis pas (et rien n'a changé dans mon réseau depuis la dernière fois que cela a fonctionné). L'ordinateur de mon système exécutant Windows et Python 2.7.2 n'a aucun problème (sur le même réseau).
>>> url = 'https://www.mediafire.com/api/user/get_session_token.php'
>>> response = urllib2.urlopen(url).read()
File "/usr/lib/python2.7/urllib2.py", line 126, in urlopen
return _opener.open(url, data, timeout)
File "/usr/lib/python2.7/urllib2.py", line 400, in open
response = self._open(req, data)
File "/usr/lib/python2.7/urllib2.py", line 418, in _open
'_open', req)
File "/usr/lib/python2.7/urllib2.py", line 378, in _call_chain
result = func(*args)
File "/usr/lib/python2.7/urllib2.py", line 1215, in https_open
return self.do_open(httplib.HTTPSConnection, req)
File "/usr/lib/python2.7/urllib2.py", line 1177, in do_open
raise URLError(err)
urllib2.URLError: <urlopen error [Errno 8] _ssl.c:504: EOF occurred in violation of protocol>
Qu'est-ce qui ne va pas? Toute aide est appréciée.
PS: les anciennes versions de python ne fonctionnent pas non plus, ni dans mon système ni dans une session en direct à partir d'USB, mais fonctionnent dans une session en direct d'Ubuntu 11.10.
Réponses:
Cela semble être lié à l'ajout de la prise en charge TLS 1.1 et 1.2 à la version d'OpenSSL trouvée dans 12.04. L'échec de connexion peut être reproduit avec l'outil de ligne de commande OpenSSL:
La connexion réussit si je force la connexion à utiliser TLS 1.0 avec l'
-tls1
argument de ligne de commande.Je vous suggère de déposer un rapport de bug sur ce problème ici:
https://bugs.launchpad.net/ubuntu/+filebug
la source
Pour les novices en python comme moi, voici la façon de remplacer httplib de la manière la plus simple. En haut de votre script python, incluez ces lignes:
À partir de là, vous pouvez utiliser urllib ou tout ce que vous utilisez comme vous le feriez normalement.
Remarque: c'est pour python 2.7. Pour une solution python 3.x, vous devez remplacer la classe HTTPSConnection trouvée dans http.client. Je laisse cela comme un exercice pour le lecteur. :-)
la source
httplib
. Les gens peuvent utiliser d'autres sockets SSL. On pourraitssl
plutôt corriger comme dans ma réponse ci-dessous.BadStatusLine: ''
Vous pouvez éviter de modifier le fichier httplib.py en modifiant votre objet HTTPSConnection:
La méthode de demande crée un nouveau socket uniquement si connection.sock n'est pas défini. Si vous créez le vôtre en ajoutant le paramètre ssl_version, la méthode de demande l'utilisera. Ensuite, tout le reste fonctionne comme d'habitude.
J'avais le même problème et cela fonctionne pour moi.
Cordialement
la source
Le problème est
ssl
, il n'a rien à voir avec HTTP, alors pourquoi patcherhttplib
si vous pouvez patcherssl
. Le code suivant devrait corriger tous les sockets SSL, y compris, mais sans s'y limiter, HTTPS, pour Python 2.6+ (intégréssl
, n'a pas essayé avecpyopenssl
).la source
MODIFIER httplib.py (/usr/lib/pythonX.X/httplib.py sous Linux)
FIND HTTPSConnection, déclaration de classe
Code de classe interne CHANGE line
À
La demande HTTPS httplib devrait fonctionner
la source
Ce problème est probablement dû à la désactivation de SSLv2 sur le serveur Web, mais Python 2.x essaie d'établir une connexion avec PROTOCOL_SSLv23 par défaut.
Voici le lien vers ma réponse pour un problème similaire sur Stack Overflow - /programming//a/24166498/41957
Mise à jour: c'est fonctionnellement la même chose que la réponse de @ temoto ci-dessus.
la source
Une solution simple qui a fonctionné pour moi a été de remplacer le protocole par défaut de SSL:
la source