从 Nodemailer 到 Postfix 的加密连接失败 "SSL23_GET_SERVER_HELLO:unknown protocol"

Encrypted connection from Nodemailer to Postfix fails with "SSL23_GET_SERVER_HELLO:unknown protocol"

我使用 Postfix 和 Dovecot 配置了一个 SMTP 邮件服务器。

当我尝试使用外部客户端通过 TLS 发送电子邮件时,出现以下错误:

/var/log/syslog:

Oct 31 19:40:49 designtuner postfix/submission/smtpd[30394]: connect from unknown[185.81.141.117]
Oct 31 19:40:49 designtuner postfix/submission/smtpd[30395]: connect from unknown[185.81.141.117]
Oct 31 19:40:49 designtuner postfix/submission/smtpd[30394]: lost connection after CONNECT from unknown[185.81.141.117]
Oct 31 19:40:49 designtuner postfix/submission/smtpd[30394]: disconnect from unknown[185.81.141.117] commands=0/0
Oct 31 19:40:49 designtuner postfix/submission/smtpd[30395]: lost connection after CONNECT from unknown[185.81.141.117]
Oct 31 19:40:49 designtuner postfix/submission/smtpd[30395]: disconnect from unknown[185.81.141.117] commands=0/0

节点 JS 客户端:

{ Error: 1XXXXXXXXXX35275584:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:../deps/openssl/openssl/ssl/s23_clnt.c:797:
code: 'ECONNECTION', command: 'CONN' }

节点 JS 文件:

let transporter = nodemailer.createTransport({
host: 'mail.designtuner.com',
port: 587,
secure: true, // secure:true for port 465, secure:false for port 587
auth: {
user: 'admin@designtuner.com',
pass: 'XXXXXXX'
},
tls: {
rejectUnauthorized: false
}
});

我错过了什么吗?是因为我的反向 DNS 还没有传播吗?我最近更新了我的反向 DNS,但该网站可以从网络浏览器访问,而且 SSL 证书似乎工作正常。

SMTP 和 STARTTLS

SMTP加密有两种方式:465端口的SMTP,先建立TLS握手,然后启动SMTP会话;587端口的SMTP,STARTTLS,先启动SMTP会话,然后初始化TLS STARTTLS SMTP 命令(然后以身份验证和所有要保护的内容开始)。

SMTP(首先是 TLS,端口 465)已被弃用;具有 STARTTLS(端口 587)的符合标准的 SMTP 并不意味着在安全或隐私方面有任何缺陷。正确配置的 SMTP 服务器将不允许在 SMTP 提交端口上进行任何不安全的连接。

使用 Nodemailer 强制加密

nodemailer 的secure flag 只是表示TLS before SMTP,这也由该行后面的注释表示(也明确说明了使用什么设置)。

secure: true, // secure:true for port 465, secure:false for port 587

查看 Nodemailer documentation,有一些关于配置选项的进一步信息:

  • options.secure if true the connection will only use TLS. If false (the default), TLS may still be upgraded to if available via the STARTTLS command.

  • [...]

  • options.requireTLS if this is true and secure is false, it forces Nodemailer to use STARTTLS even if the server does not advertise support for it.

换句话说,要按照标准和最佳实践实施加密会话,请设置 requireTLS 而不是 secure 并在端口 587 上使用 SMTP 提交。

您代码中的注释已经指出了问题所在,即 secure 应该针对端口 587

设置为 false
port: 587,
secure: true, // secure:true for port 465, secure:false for port 587

the documentation 也是如此,它清楚地表明:

secure – if true the connection will use TLS when connecting to server. If false (the default) then TLS is used if server supports the STARTTLS extension. In most cases set this value to true if you are connecting to port 465. For port 587 or 25 keep it false

原因是 secure 需要隐式 TLS,即从一开始就是 TLS。但是,端口25和端口587通常使用显式TLS,即普通连接,然后在STARTTLS命令成功后升级到TLS。

如果您想使用显式 TLS(端口 587),但还要确保 TLS 不是可选的,请使用 requireTLS,如文档所述:

requireTLS – if this is true and secure is false then Nodemailer tries to use STARTTLS even if the server does not advertise support for it. If the connection can not be encrypted then message is not sent