Solución de problemas
¿Por qué recibo errores de TLS al conectarme a SMTP?
Soluciona los errores de negociación SSL y TLS con smtp.emailit.com, como «wrong version number», los nombres de certificado que no coinciden y los fallos de STARTTLS.
Este artículo cubre los errores que se producen mientras tu cliente y el SMTP relay de Emailit establecen el cifrado. Casi siempre se deben a que el puerto no coincide con el modo TLS configurado en tu cliente.
Síntomas
SSL routines:ssl3_get_record:wrong version numberoERR_SSL_WRONG_VERSION_NUMBERHostname/IP does not match certificate's altnamesocertificate verify failedSTARTTLS failed,Greeting never receivedo la conexión se queda colgada después de conectarunsupported protocolono protocols available
Causa
Emailit usa dos modos TLS, y cada puerto espera uno de ellos:
| Puerto | Modo | Configuración habitual del cliente |
|---|---|---|
| 587, 2525, 2587, 25 | STARTTLS: la sesión empieza en texto plano y pasa a cifrado | Nodemailer secure: false, PHPMailer ENCRYPTION_STARTTLS, «TLS» en la mayoría de las interfaces |
| 465 | TLS implícito: cifrado desde el primer byte | Nodemailer secure: true, PHPMailer ENCRYPTION_SMTPS, «SSL» en la mayoría de las interfaces |
Las causas habituales son:
- TLS implícito en un puerto STARTTLS, por ejemplo
secure: truecon el puerto 587. El cliente espera una negociación TLS pero recibe un saludo en texto plano, lo que produce «wrong version number». - STARTTLS en el puerto 465. El cliente espera un saludo que el servidor nunca envía en texto claro, así que la conexión se queda colgada.
- Conectarse por dirección IP o a través de tu propio CNAME. El certificado se emite para
smtp.emailit.com, así que cualquier otro nombre de host no supera la verificación. - Una pila TLS antigua. El relay negocia TLS 1.2 o TLS 1.3. Los clientes limitados a TLS 1.0 o 1.1, o con un paquete de certificados de CA obsoleto, no pueden completar la negociación.
- Inspección del tráfico. Algunos antivirus y proxies corporativos interceptan SMTP y presentan su propio certificado.
Solución
-
Haz que el puerto coincida con el modo. Usa el puerto
587con STARTTLS, o el puerto465con TLS implícito. No los mezcles.const transporter = nodemailer.createTransport({ host: 'smtp.emailit.com', port: 587, secure: false, // STARTTLS on 587; set true only for port 465 requireTLS: true, // refuse to send if the upgrade fails auth: { user: 'emailit', pass: process.env.EMAILIT_API_KEY }, }); -
Usa el nombre de host exacto. Configura el host como
smtp.emailit.com. No uses una dirección IP ni un alias. -
Exige cifrado en tu cliente. STARTTLS se ofrece en todos los puertos de texto plano, pero el relay no lo impone. Activa la opción «require TLS» de tu cliente para que las credenciales nunca se envíen sin cifrar.
-
Prueba la negociación desde la máquina que envía.
openssl s_client -starttls smtp -connect smtp.emailit.com:587 -servername smtp.emailit.com openssl s_client -connect smtp.emailit.com:465 -servername smtp.emailit.comUn resultado correcto muestra
subject=CN=smtp.emailit.comyVerify return code: 0 (ok). Un subject distinto significa que algo en tu red está interceptando la conexión. -
Actualiza los entornos de ejecución antiguos. Actualiza el runtime del lenguaje o OpenSSL, y los certificados de CA del sistema, si tu cliente no puede negociar TLS 1.2.
Si la negociación funciona pero el inicio de sesión falla, consulta ¿Por qué SMTP devuelve 535 Authentication failed?. Si no puedes conectarte en absoluto, consulta ¿Por qué se agota el tiempo de espera de mi conexión SMTP?.
¿Sigues teniendo problemas?
Contacta con soporte o pregunta en Discord. Incluye el puerto, la biblioteca cliente y su versión, y la salida del comando openssl s_client.