Saltar al contenido
ecdsa.com
Python ssl module (OpenSSL 3)cryptography de Python

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

Cómo solucionarlo

  1. 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. 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. 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)

Errores relacionados

Explorar toda la base de datos de errores de firma