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
Une pile TLS obsolète sur un serveur ou un équipement
fréquenteLes anciennes versions de Windows Server, les anciens serveurs Java, les ERP, les équipements réseau et certains points de terminaison d’administrations ou de banques utilisent encore des implémentations TLS qui n’ont jamais intégré la RFC 5746.
Un équipement intermédiaire qui termine TLS sans prendre en charge la RFC 5746
fréquenteD’anciens répartiteurs de charge et proxys (certaines versions de F5 BIG-IP et de proxys d’entreprise) terminent TLS pour des backends modernes et présentent aux clients leur propre comportement obsolète.
Le client est passé à OpenSSL 3
fréquenteLe même serveur fonctionnait avec des builds de Python reposant sur OpenSSL 1.1.1 ; la mise à jour de Python, du système d’exploitation ou de l’image de base d’un conteneur a remplacé OpenSSL et introduit son comportement par défaut plus strict.
Comment corriger l’erreur
- 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.
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.
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)