Tengo una pequeña aplicación que escribí en Python y solía funcionar ... hasta ayer, cuando de repente comenzó a darme un error en una conexión HTTPS. No recuerdo si hubo una actualización, pero tanto Python 2.7.3rc2 como Python 3.2 están fallando de la misma manera.
Lo busqué en Google y descubrí que esto sucede cuando las personas están detrás de un proxy, pero yo no (y nada ha cambiado en mi red desde la última vez que funcionó). La computadora de mi syster que ejecuta Windows y Python 2.7.2 no tiene problemas (en la misma red).
>>> 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>
Que pasa Cualquier ayuda es apreciada.
PD .: Las versiones antiguas de python tampoco funcionan, ni en mi sistema ni en una sesión en vivo desde USB, pero sí funcionan en una sesión en vivo de Ubuntu 11.10.
Respuestas:
Esto parece estar relacionado con la adición de compatibilidad con TLS 1.1 y 1.2 a la versión de OpenSSL que se encuentra en 12.04. El error de conexión se puede reproducir con la herramienta de línea de comandos OpenSSL:
La conexión tiene éxito si fuerzo la conexión a usar TLS 1.0 con el
-tls1
argumento de la línea de comando.Le sugiero que presente un informe de error sobre este problema aquí:
https://bugs.launchpad.net/ubuntu/+filebug
fuente
Para los principiantes de Python como yo, esta es la forma de anular httplib de la manera más fácil. En la parte superior de su secuencia de comandos de Python, incluya estas líneas:
De aquí en adelante, puede usar urllib o lo que sea que use como lo haría normalmente.
Nota: Esto es para Python 2.7. Para una solución python 3.x, debe anular la clase HTTPSConnection que se encuentra en http.client. Lo dejo como ejercicio para el lector. :-)
fuente
httplib
. Las personas pueden usar otros sockets SSL. Uno podría parchear en sussl
lugar como en mi respuesta a continuación.BadStatusLine: ''
Puede evitar modificar el archivo httplib.py modificando su objeto HTTPSConnection:
El método de solicitud crea un nuevo socket solo si connection.sock no está definido. Si crea el suyo propio y agrega el parámetro ssl_version, el método de solicitud lo usará. Entonces todo lo demás funciona como de costumbre.
Estaba teniendo el mismo problema y esto funciona para mí.
Saludos
fuente
El problema está en
ssl
que no tiene nada que ver con HTTP, entonces, ¿por qué parchearhttplib
si puede parcharssl
? El siguiente código debería corregir todos los sockets SSL, incluidos, entre otros, HTTPS, para Python 2.6+ (integradossl
, no lo probépyopenssl
).fuente
EDITAR httplib.py (/usr/lib/pythonX.X/httplib.py en Linux)
FIND HTTPS Declaración de clase de conexión
Línea de CAMBIO de código de clase interior
A
Entonces la solicitud httplib HTTPS debería funcionar
fuente
Es probable que este problema se deba a que SSLv2 está deshabilitado en el servidor web, pero Python 2.x intenta establecer una conexión con PROTOCOL_SSLv23 de forma predeterminada.
Aquí está el enlace a mi respuesta para un problema similar en Stack Overflow: /programming//a/24166498/41957
Actualización: esto es funcionalmente lo mismo que la respuesta de @ temoto anterior.
fuente
Una solución simple que funcionó para mí fue anular el protocolo predeterminado de SSL:
fuente