Python Requests requests.exceptions.SSLError: _ssl.c: 504: EOF ocurrió en violación del protocolo

Estoy en Ubuntu 12.10 con OpenSSL 1.0.1c, python 2.7.3, Requests 1.0.3 y 1.0.4 (probé ambos), y cuando bash conectarme al sitio web en la variable url con el siguiente código.

def SendInitialRequest(xmlmessage, redirecturl): url = 'https://centineltest.cardinalcommerce.com/maps/txns.asp' payload = 'cmpi_msg=' + ET.tostring(xmlmessage) headers = { 'Content-Type': 'application/x-www-form-urlencoded', } r = requests.post(url, data=payload, headers=headers, verify=None) print r.text 

Lanza el siguiente error:

 Traceback (most recent call last): File "", line 1, in  File "clams/libs/centinel/thinclient.py", line 134, in SendInitialRequest r = requests.post(url, data=payload, headers=headers, verify=None) File "/home/jasonamyers/.virtualenv/clams/lib/python2.7/site-packages/requests/api.py", line 87, in post return request('post', url, data=data, **kwargs) File "/home/jasonamyers/.virtualenv/clams/lib/python2.7/site-packages/requests/api.py", line 44, in request return session.request(method=method, url=url, **kwargs) File "/home/jasonamyers/.virtualenv/clams/lib/python2.7/site-packages/requests/sessions.py", line 269, in request resp = self.send(prep, stream=stream, timeout=timeout, verify=verify, cert=cert, proxies=proxies) File "/home/jasonamyers/.virtualenv/clams/lib/python2.7/site-packages/requests/sessions.py", line 364, in send r = adapter.send(request, **kwargs) File "/home/jasonamyers/.virtualenv/clams/lib/python2.7/site-packages/requests/adapters.py", line 163, in send raise SSLError(e) requests.exceptions.SSLError: [Errno 8] _ssl.c:504: EOF occurred in violation of protocol 

Intentar la conexión con openssl devuelve lo siguiente:

 $ openssl s_client -connect centineltest.cardinalcommerce.com:443 CONNECTED(00000003) 140019346777760: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 226 bytes --- New, (NONE), Cipher is (NONE) Secure Renegotiation IS NOT supported Compression: NONE Expansion: NONE --- 

Si lo fuerzo a usar tls1 funciona (salida truncada):

 $ openssl s_client -tls1 -connect centineltest.cardinalcommerce.com:443 CONNECTED(00000003) depth=2 C = US, O = "thawte, Inc.", OU = Certification Services Division, OU verify error:num=20:unable to get local issuer certificate verify return:0 --- 

He visto numerosos informes de errores para esto; sin embargo, no he encontrado una forma de evitarlo utilizando la biblioteca de solicitudes de python. Cualquier ayuda sería apreciada grandemente

    Enviar esto aquí para otros desde la página de emisión de solicitudes :

    Las solicitudes no son compatibles con esto antes de la versión 1. Luego de la versión 1, se espera que subclasifique el HTTPAdapter, de esta manera:

     from requests.adapters import HTTPAdapter from requests.packages.urllib3.poolmanager import PoolManager import ssl class MyAdapter(HTTPAdapter): def init_poolmanager(self, connections, maxsize, block=False): self.poolmanager = PoolManager(num_pools=connections, maxsize=maxsize, block=block, ssl_version=ssl.PROTOCOL_TLSv1) 

    Cuando hayas hecho eso, puedes hacer esto:

     import requests s = requests.Session() s.mount('https://', MyAdapter()) 

    Cualquier solicitud a través de ese objeto de sesión utilizará TLSv1.

    La configuración de verificar = Falso solo omite la verificación del certificado del servidor, pero no ayudará a resolver los errores del protocolo SSL.

    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. Esto sucede en https://github.com/python/cpython/blob/360aa60b2a36f5f6e9e20325efd8d472f7559b1e/Lib/ssl.py#L1057

    Puede mono-patch ssl.wrap_socket () en el módulo ssl anulando el parámetro de palabra clave ssl_version. El siguiente código se puede utilizar como está. Ponga esto al inicio de su progtwig antes de hacer cualquier solicitud.

     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) 

    Instalando los extras del paquete de “seguridad” para las requests resueltas por mí:

    sudo apt-get install libffi-dev

    sudo pip install -U peticiones [seguridad]

    Este es un error conocido, puedes solucionarlo con un hack:

    Abra el site-packages/requests/packages/urllib3/connectionpool.py (o simplemente haga una copia local de las solicitudes dentro de su propio proyecto) y cambie el bloque que dice:

     def connect(self): # Add certificate verification sock = socket.create_connection((self.host, self.port), self.timeout) # Wrap socket using verification with the root certs in # trusted_root_certs self.sock = ssl_wrap_socket(sock, self.key_file, self.cert_file, cert_reqs=self.cert_reqs, ca_certs=self.ca_certs, server_hostname=self.host, ssl_version=self.ssl_version) 

    a:

     def connect(self): # Add certificate verification sock = socket.create_connection((self.host, self.port), self.timeout) # Wrap socket using verification with the root certs in # trusted_root_certs self.sock = ssl_wrap_socket(sock, self.key_file, self.cert_file, cert_reqs=self.cert_reqs, ca_certs=self.ca_certs, server_hostname=self.host, ssl_version=ssl.PROTOCOL_TLSv1) 

    De lo contrario, supongo que hay una anulación en alguna parte que es menos intrépida, pero no pude encontrar una con algunas miradas.

    NOTA : en una nota al margen, las requests de PIP (1.0.4) en un MacOS simplemente funcionan con la URL que proporcionó.

    Encontré este error y parece que la solución está desactivando SNI, que Python 2.7 no admite:

    http://bugs.python.org/issue5639

    urllib3 en Python 2.7 SNI error en Google App Engine

    A las personas que no pueden obtener arreglos por encima del trabajo.

    Tuvo que cambiar el archivo ssl.py para arreglarlo. Busque la función create_default_context y cambie la línea:

     context = SSLContext(PROTOCOL_SSLv23) 

    a

     context = SSLContext(PROTOCOL_TLSv1) 

    Tal vez alguien pueda crear una solución más fácil sin editar ssl.py?

    Tuve el mismo problema:

    elevar SSLError (e)
    requests.exceptions.SSLError: [Errno 8] _ssl.c: 504: EOF ocurrió en violación del protocolo

    Tuve fiddler corriendo, detuve la captura de fiddler y no vi este error. Podría ser por culpa del violinista.

    Desafortunadamente la respuesta aceptada no funcionó para mí. Como solución temporal temporal, también puede utilizar verify=False al conectarse al sitio web seguro.

    Desde Python Requests lanzando SSLError

     requests.get('https://example.com', verify=True) 

    He tenido este error al conectarme a un servidor RabbitMQ MQTT a través de TLS. Estoy bastante seguro de que el servidor está roto pero de todos modos funcionó con OpenSSL 1.0.1, pero no con OpenSSL 1.0.2.

    Puedes verificar tu versión en Python usando esto:

     import ssl ssl.OPENSSL_VERSION 

    No estoy seguro de cómo degradar OpenSSL dentro de Python (parece estar vinculado estáticamente al menos en Windows), aparte de usar una versión anterior de Python.

    Estaba teniendo un problema similar y creo que si simplemente ignoramos la verificación de ssl funcionará como encanto, como funcionó para mí. De modo que se conecta al servidor con el esquema https pero se les indica que no verifiquen el certificado.

    Utilizando requests . Solo menciona verify=False lugar de None

      requests.post(url, data=payload, headers=headers, verify=False) 

    Esperando que esto funcione para aquellos que lo necesitan :).