Solução de problemas
Por que recebo erros de TLS ao me conectar ao SMTP?
Resolva erros de handshake SSL e TLS com o smtp.emailit.com, como “wrong version number”, nomes de certificado que não correspondem e falhas de STARTTLS.
Este artigo cobre os erros que acontecem enquanto o seu cliente e o SMTP relay do Emailit estabelecem a criptografia. Eles quase sempre vêm de uma incompatibilidade entre a porta e o modo de TLS configurado no seu cliente.
Sintomas
SSL routines:ssl3_get_record:wrong version numberouERR_SSL_WRONG_VERSION_NUMBERHostname/IP does not match certificate's altnamesoucertificate verify failedSTARTTLS failed,Greeting never receivedou a conexão trava depois de conectarunsupported protocolouno protocols available
Causa
O Emailit usa dois modos de TLS, e cada porta espera um deles:
| Porta | Modo | Configuração típica do cliente |
|---|---|---|
| 587, 2525, 2587, 25 | STARTTLS: a sessão começa em texto simples e é atualizada | Nodemailer secure: false, PHPMailer ENCRYPTION_STARTTLS, “TLS” na maioria das interfaces |
| 465 | TLS implícito: criptografado desde o primeiro byte | Nodemailer secure: true, PHPMailer ENCRYPTION_SMTPS, “SSL” na maioria das interfaces |
As causas comuns são:
- TLS implícito em uma porta STARTTLS, por exemplo
secure: truecom a porta 587. O cliente espera um handshake TLS, mas recebe uma saudação em texto simples, o que produz “wrong version number”. - STARTTLS na porta 465. O cliente espera uma saudação que o servidor nunca envia em texto claro, e a conexão trava.
- Conexão por endereço IP ou por um CNAME seu. O certificado é emitido para
smtp.emailit.com, então qualquer outro nome de host falha na verificação. - Uma pilha TLS antiga. O relay negocia TLS 1.2 ou TLS 1.3. Clientes limitados a TLS 1.0 ou 1.1, ou com um pacote de CAs desatualizado, não conseguem concluir o handshake.
- Inspeção de tráfego. Alguns antivírus e proxies corporativos interceptam o SMTP e apresentam o próprio certificado.
Solução
-
Combine a porta com o modo. Use a porta
587com STARTTLS ou a porta465com TLS implícito. Não misture os dois.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 }, }); -
Use o nome de host exato. Defina o host como
smtp.emailit.com. Não use um endereço IP nem um alias. -
Exija criptografia no seu cliente. O STARTTLS é oferecido em todas as portas de texto simples, mas o relay não o impõe. Ative a opção “require TLS” do seu cliente para que as credenciais nunca sejam enviadas sem criptografia.
-
Teste o handshake a partir da máquina que envia.
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.comUm resultado saudável mostra
subject=CN=smtp.emailit.comeVerify return code: 0 (ok). Um subject diferente significa que algo na sua rede está interceptando a conexão. -
Atualize runtimes antigos. Atualize o runtime da linguagem ou o OpenSSL e os certificados de CA do sistema se o seu cliente não conseguir negociar TLS 1.2.
Se o handshake funcionar, mas o login falhar, consulte Por que o SMTP retorna 535 Authentication failed?. Se você não conseguir nem se conectar, consulte Por que a minha conexão SMTP dá timeout?.
Ainda com problemas?
Fale com o suporte ou pergunte no Discord. Informe a porta, a biblioteca do seu cliente e a versão dela, e a saída do comando openssl s_client.