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

Message d’erreur

[SSL: WRONG_VERSION_NUMBER] wrong version number

Également affiché sous la forme

  • ssl.SSLError: [SSL: WRONG_VERSION_NUMBER] wrong version number

Suivi d’un emplacement dans le code source, comme « (_ssl.c:1082) ». urllib l’affiche dans « <urlopen error …> », requests et urllib3 dans « Max retries exceeded … (Caused by SSLError(…)) ».

Python ssl module (OpenSSL) — ssl.SSLError, SSL_R_WRONG_VERSION_NUMBER

Ce que cela signifie

Python a commencé un handshake TLS, et les octets reçus en retour ne forment pas un enregistrement TLS : OpenSSL les lit comme un en-tête d’enregistrement doté d’une version du protocole impossible. En pratique, le pair parle en clair sur ce port – un serveur HTTP, un proxy qui attend du HTTP en clair, ou un serveur SMTP qui attend l’échange de salutations précédant STARTTLS.

Pourquoi cela se produit

Comment corriger l’erreur

  1. 1.

    Déterminer le protocole que parle le port

    Interrogez le port avec http:// et tentez un handshake TLS avec openssl s_client ; utilisez ensuite le schéma correspondant ou le bon port.

    bash
    curl -si http://127.0.0.1:8080/ | head -1          # an HTTP status line: the port is plain HTTP
    openssl s_client -connect 127.0.0.1:8443 -brief </dev/null   # a TLS summary: the port speaks TLS
  2. 2.

    Écrire les URL de proxy avec http://

    L’entrée https du dictionnaire proxies désigne le proxy à utiliser pour les destinations HTTPS ; le schéma de son URL indique comment communiquer avec le proxy lui-même. Le trafic vers la destination reste protégé par TLS de bout en bout.

    python
    import requests
    
    # Most forward proxies take plain HTTP from the client and tunnel TLS with CONNECT
    proxies = {"https": "http://proxy.example.net:3128"}   # http:// here, not https://
    requests.get("https://api.example.com/", proxies=proxies)
  3. 3.

    Messagerie : choisir la classe selon le port

    Utilisez SMTP + starttls() sur le 587 et SMTP_SSL sur le 465 ; la même règle s’applique à imaplib et à poplib.

    python
    import smtplib, ssl
    
    ctx = ssl.create_default_context()
    # Port 587: plain connection first, then STARTTLS
    with smtplib.SMTP("mail.example.com", 587) as s:
        s.starttls(context=ctx)
    # Port 465: implicit TLS from the first byte
    with smtplib.SMTP_SSL("mail.example.com", 465, context=ctx) as s:
        s.noop()

Erreurs associées

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