Mensaje de error
[SSL: UNSAFE_LEGACY_RENEGOTIATION_DISABLED] unsafe legacy renegotiation disabled
Aparece con Python enlazado con OpenSSL 3.0 o posterior (la mayoría de las compilaciones de Python desde 2022); OpenSSL 1.1.1 todavía permitía estos servidores. Le sigue una ubicación en el código fuente como «(_ssl.c:1082)».
Python ssl module (OpenSSL 3) — ssl.SSLError, SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED
Qué significa
El servidor negoció TLS 1.2 o una versión anterior sin la extensión de renegociación segura del RFC 5746. Los clientes de OpenSSL 3 rechazan estos servidores de forma predeterminada, porque la renegociación antigua permitía que un intermediario malicioso insertara sus propios datos delante de la solicitud del cliente (CVE-2009-3555). Python adopta ese valor predeterminado, así que la conexión falla durante el handshake.
Por qué ocurre
Una pila TLS obsoleta en un servidor o un equipo dedicado
frecuenteVersiones antiguas de Windows Server, servidores Java heredados, sistemas ERP, dispositivos de red y algunos endpoints gubernamentales o bancarios siguen usando implementaciones de TLS que nunca incorporaron el RFC 5746.
Un dispositivo intermedio que termina TLS sin el RFC 5746
frecuenteBalanceadores de carga y proxies antiguos (algunas versiones de F5 BIG-IP y de proxies corporativos) terminan TLS delante de backends modernos y muestran a los clientes su propio comportamiento antiguo.
El cliente pasó a OpenSSL 3
frecuenteEl mismo servidor funcionaba con compilaciones de Python sobre OpenSSL 1.1.1; al actualizar Python, el sistema operativo o la imagen base de un contenedor, cambió OpenSSL y, con él, llegó su valor predeterminado más estricto.
Cómo solucionarlo
- 1.
Confirmar que el servidor no admite la renegociación segura
openssl s_client indica «Secure Renegotiation IS NOT supported» con estos servidores.
bash openssl s_client -connect legacy.example.com:443 -servername legacy.example.com </dev/null 2>/dev/null \ | grep -i 'secure renegotiation' # "Secure Renegotiation IS NOT supported" confirms the server lacks RFC 5746 - 2.
Corregir el servidor
Actualizar la pila TLS o el firmware del servidor, u ofrecer TLS 1.3, elimina el problema para todos los clientes.
text Server / appliance owners: update the TLS stack or firmware to any release supporting RFC 5746 (every mainstream TLS library since 2010), or enable TLS 1.3, which has no renegotiation at all. - 3.
Solución provisional: permitirlo solo para un host
ssl.OP_LEGACY_SERVER_CONNECT (Python 3.12+) vuelve a permitir las conexiones a estos servidores solo en ese contexto. Para ese host reabre el riesgo de inserción de datos mediante la renegociación, así que no lo actives de forma global ni mediante la configuración de OpenSSL del sistema.
python # Temporary workaround for one legacy host only (Python 3.12+: ssl.OP_LEGACY_SERVER_CONNECT) import ssl, urllib.request ctx = ssl.create_default_context() ctx.options |= ssl.OP_LEGACY_SERVER_CONNECT urllib.request.urlopen("https://legacy.example.com/", context=ctx)