ssl smtp openssl smtplib python-3.4

ssl - smtplib.SMTP starttls falla con el error de descodificación de alerta tlsv1



openssl python-3.4 (1)

Encontré el siguiente comportamiento perculiar hoy.

El siguiente código funciona en Python 3.3:

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

En Pyhton 3.4 el código anterior no funciona, en su lugar se encuentra el siguiente error:

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)

Si el código anterior se modifica para especificar el host y el puerto en el constructor y no utiliza el método de conexión, como en el código siguiente, entonces funciona.

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

El comportamiento anterior ocurre con OpenSSL versión 1.0.1f y OpenSSL 1.0.1g

¿Podría alguien explicarme este comportamiento?


Según un tcpdump, el código en 3.4 envía una extensión SNI con un nombre de destino vacío. SNI (Server Name Indication) se usa cuando hay diferentes certificados detrás de la misma dirección IP. Considero que es un error: si no tiene un nombre, no debe enviar la extensión SNI en lugar de enviar una extensión con un nombre de longitud cero.