Aller au contenu
ecdsa.com
Python ssl module (OpenSSL 3)cryptography (Python)

Message d’erreur

[SSL: UNSAFE_LEGACY_RENEGOTIATION_DISABLED] unsafe legacy renegotiation disabled

Apparaît avec un Python lié à OpenSSL 3.0 ou à une version ultérieure (la plupart des builds de Python depuis 2022) ; OpenSSL 1.1.1 acceptait encore ces serveurs. Un emplacement dans le code source, comme « (_ssl.c:1082) », suit le message.

Python ssl module (OpenSSL 3) — ssl.SSLError, SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED

Ce que cela signifie

Le serveur a négocié TLS 1.2 ou une version antérieure sans l’extension de renégociation sécurisée de la RFC 5746. Les clients OpenSSL 3 refusent ces serveurs par défaut, car l’ancienne renégociation permettait à un attaquant en position d’homme du milieu d’insérer ses propres données en tête de la requête du client (CVE-2009-3555). Python hérite de ce comportement par défaut : la connexion échoue donc pendant le handshake.

Pourquoi cela se produit

Comment corriger l’erreur

  1. 1.

    Confirmer que le serveur ne prend pas en charge la renégociation sécurisée

    openssl s_client signale « Secure Renegotiation IS NOT supported » pour ces serveurs.

    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.

    Corriger le serveur

    Mettre à jour la pile TLS ou le micrologiciel du serveur, ou proposer TLS 1.3, élimine le problème pour tous les clients.

    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.

    Contournement temporaire : l’autoriser pour un seul hôte

    ssl.OP_LEGACY_SERVER_CONNECT (Python 3.12+) réactive les connexions à ces serveurs pour ce seul contexte. Cette option rouvre pour cet hôte le risque d’injection de données par renégociation : ne la définissez donc ni globalement ni via la configuration OpenSSL du système.

    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)

Erreurs associées

Parcourir toute la base de données des erreurs de signature