Obligando a la biblioteca de solicitudes a usar TLSv1.1 o TLSv1.2 en Python

Estoy intentando enviar una llamada POST utilizando la biblioteca de solicitudes en python a un servidor. Anteriormente pude enviar con éxito llamadas POST, pero recientemente, el servidor dejó de usar TLSv1.0 y ahora solo admite TLSv1.1 y TLSv1.2. Ahora el mismo código me lanza un error “requests.exceptions.SSLError: EOF se produjo en violación del protocolo (_ssl.c: 590)”.

Encontré este hilo en stackoverflow Solicitudes de Python requests.exceptions.SSLError: [Errno 8] _ssl.c: 504: EOF ocurrió en violación del protocolo que dice que necesitamos subclasificar el HTTPAdapter después de lo cual el objeto de la sesión usará TLSv1. Cambié mi código en consecuencia y aquí está mi nuevo código

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) url="https://mywebsite.com/ui/" headers={"Cookie":"some_value","X-CSRF-Token":"some value","Content-Type":"application/json"} payload={"name":"some value","Id":"some value"} s = requests.Session() s.mount('https://', MyAdapter()) r=s.post(url,json=payload,headers=headers) html=r.text print html 

Pero incluso después de usar esto, obtengo el mismo error “EOF ocurrió en violación del protocolo (_ssl.c: 590)”.

Mi primera pregunta es que, en algún lugar, leí que las solicitudes de forma predeterminada utilizan ssl. Sé que mi servidor usaba TLSv1.0 entonces, ¿estaba funcionando mi código porque TLSv1.0 tiene compatibilidad con versiones anteriores con ssl3.0?

Mi segunda pregunta es que, el subproceso de stackoverflow que mencioné anteriormente con el cual cambié mi código a subclase HTTPAdapter, dijo que esto funcionará para TLSv1. Pero como TLSv1.0 está en desuso en mi servidor, ¿este código seguirá funcionando?

La stack TLS usará la mejor versión disponible automáticamente. Si ya no funciona cuando la compatibilidad con TLS 1.0 está deshabilitada en el servidor, generalmente significa que su stack de TLS local simplemente no admite una versión de protocolo más nueva como TLS 1.2. Este suele ser el caso en Mac OS X, ya que se envía con una versión antigua de OpenSSL (0.9.8). En este caso, ningún código de Python lo ayudará a solucionar el problema, pero necesita obtener un python que use una versión más reciente de OpenSSL.

Para verificar qué versión de openssl está utilizando, ejecute lo siguiente en python:

 import ssl print ssl.OPENSSL_VERSION 

Para tener soporte para TLS 1.2 necesita OpenSSL versión 1.0.2 o 1.0.1. Si solo tiene 1.0.0 o 0.9.8, necesita actualizar su Python + OpenSSL. Consulte Actualización de openssl en python 2.7 para obtener más información sobre cómo hacer esto.