python - Solicitudes que no se pueden conectar a un servidor TLS
ssl python-requests (1)
Tengo un problema para rastrear por qué las
requests
no se conectan a un host específico.
Lo siguiente funciona bien a través de curl o navegador:
curl https://banking4.anz.com
Sin embargo, si uso solicitudes:
requests.get(''https://banking4.anz.com'')
Yo obtengo:
SSLError: ("bad handshake: SysCallError(-1, ''Unexpected EOF'')",)
En el cable, solo veo el saludo del cliente y el servidor se desconecta de inmediato, por lo que no parece ninguna incompatibilidad de cifrado o SSL. (Esperaría un error de capa SSL para esos) ¿Qué más podría ser un problema en este caso?
Estoy en Python 3.6.1 con solicitudes 2.14.2 (con extras de seguridad).
Este servidor está roto de múltiples maneras.
Por un lado, solo comprende DES-CBC3-SHA, que se considera inseguro y no está incluido en el conjunto de cifrado predeterminado utilizado por las solicitudes . Además, parece que solo verifica un número limitado de cifrados ofrecidos en ClientHello y, por lo tanto, no verá que DES-CBC3-SHA sea ofrecido por el cliente si hay demasiadas otras ofertas antes de este cifrado.
Una solución rápida para este servidor roto es ofrecer solo el único cifrado que el servidor admite:
import requests
requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS = ''DES-CBC3-SHA''
requests.get(''https://banking4.anz.com'')
Pero tenga en cuenta que esto establece la lista de cifrado predeterminada de solicitudes a un valor inseguro. Por lo tanto, este método no debe usarse si desea conectarse a otros sitios dentro de su aplicación. En cambio, eche un vistazo a esta solución más compleja de usar su propio HTTPAdapter con configuraciones de cifrado específicas para el sitio roto.