2014-05-12 20 views
5

Ho riscontrato il seguente comportamento percussivo oggi.smtplib.SMTP starttls non riesce con errore di decodifica avviso tlsv1

Il seguente codice funziona su Python 3.3:

smtp = smtplib.SMTP() 
smtp.connect(host="smtp.gmail.com", port=587) 
smtp.ehlo() 
smtp.starttls() 

Nel Pyhton 3.4 del codice di cui sopra non funziona, invece viene rilevato il seguente errore:

File "smtp_test.py", line 10, in <module> 
    smtp.starttls() 
    File "/usr/lib/python3.4/smtplib.py", line 676, in starttls 
    server_hostname=server_hostname) 
    File "/usr/lib/python3.4/ssl.py", line 344, in wrap_socket 
    _context=self) 
    File "/usr/lib/python3.4/ssl.py", line 540, in __init__ 
    self.do_handshake() 
    File "/usr/lib/python3.4/ssl.py", line 767, in do_handshake 
    self._sslobj.do_handshake() 
    ssl.SSLError: [SSL: TLSV1_ALERT_DECODE_ERROR] tlsv1 alert decode error (_ssl.c:598) 

Se il codice di cui sopra viene modificato per specificare l'host e la porta nel costruttore e non utilizzare il metodo connect, come nel codice seguente, quindi funziona.

smtp = smtplib.SMTP(host="smtp.gmail.com", port=587) 
smtp.ehlo() 
smtp.starttls() 

Il comportamento precedente si verifica con OpenSSL versione 1.0.1f e OpenSSL 1.0.1g

Qualcuno potrebbe spiegare questo comportamento a me?

risposta

4

In base a un tcpdump, il codice in 3.4 invia l'estensione SNI con un nome di destinazione vuoto. SNI (Server Name Indication) viene utilizzato quando si hanno certificati diversi dietro lo stesso indirizzo IP. Considero questo un bug: se non ha un nome non dovrebbe inviare l'estensione SNI invece di inviare un'estensione con un nome a lunghezza zero.

+1

Perché funziona il secondo pezzo di codice, che utilizza lo stesso metodo di connessione nel costruttore, quindi funziona? – Burmudar

+1

perché probabilmente salva l'host all'interno del costruttore e lo riutilizza per l'estensione SNI. E la connessione probabilmente non salva l'host. –