Versión SSL en httplib2: EOF ocurrió en violación del protocolo

Estoy emitiendo una solicitud GET de HTTPS a un servicio REST que poseo con httplib2 pero recibimos el error:

[Errno 8] _ssl.c:504: EOF occurred in violation of protocol 

Todos los demás clientes funcionan bien (navegador, cliente Java, etc.) con la pequeña excepción de que PHP curl necesitaba configurarse para usar SSL v3.

He buscado por todas partes y parece que es un error con respecto a la versión SSL, pero parece que no puedo encontrar una manera de cambiarlo en httplib2. ¿Hay alguna forma de evitarlo además de cambiar la siguiente línea en el código fuente:

 # We should be specifying SSL version 3 or TLS v1, but the ssl module # doesn't expose the necessary knobs. So we need to go with the default # of SSLv23. return ssl.wrap_socket(sock, keyfile=key_file, certfile=cert_file, cert_reqs=cert_reqs, ca_certs=ca_certs) 

Desarrollé esta solución para httplib2:

 import httplib2 # Start of the workaround for SSL3 # This is a monkey patch / module function overriding # to allow pages that only work with SSL3 # Build the appropriate socket wrapper for ssl try: import ssl # python 2.6 httplib2.ssl_SSLError = ssl.SSLError def _ssl_wrap_socket(sock, key_file, cert_file, disable_validation, ca_certs): if disable_validation: cert_reqs = ssl.CERT_NONE else: cert_reqs = ssl.CERT_REQUIRED # Our fix for sites the only accepts SSL3 try: # Trying SSLv3 first tempsock = ssl.wrap_socket(sock, keyfile=key_file, certfile=cert_file, cert_reqs=cert_reqs, ca_certs=ca_certs, ssl_version=ssl.PROTOCOL_SSLv3) except ssl.SSLError, e: tempsock = ssl.wrap_socket(sock, keyfile=key_file, certfile=cert_file, cert_reqs=cert_reqs, ca_certs=ca_certs, ssl_version=ssl.PROTOCOL_SSLv23) return tempsock httplib2._ssl_wrap_socket = _ssl_wrap_socket except (AttributeError, ImportError): httplib2.ssl_SSLError = None def _ssl_wrap_socket(sock, key_file, cert_file, disable_validation, ca_certs): if not disable_validation: raise httplib2.CertificateValidationUnsupported( "SSL certificate validation is not supported without " "the ssl module installed. To avoid this error, install " "the ssl module, or explicity disable validation.") ssl_sock = socket.ssl(sock, key_file, cert_file) return httplib.FakeSocket(sock, ssl_sock) httplib2._ssl_wrap_socket = _ssl_wrap_socket # End of the workaround for SSL3 if __name__ == "__main__": h1 = httplib2.Http() resp, content = h1.request("YOUR_SSL3_ONLY_LINK_HERE", "GET") print(content) 

Esta solución se basó en las soluciones para urllib2 presentadas en este informe de error http://bugs.python.org/issue11220 ,

Actualización : Presentando una solución para httplib2. No noté que estabas usando httplib2, pensé que era urllib2.

Consulte otros subprocesos de StackOverflow que especifican una solución. La forma de especificar una versión TLS fuerza la versión SSL a TLSv1 como se menciona en la respuesta del usuario favoretti dentro del enlace provisto.

Con suerte, esto funciona.