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



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

  • 操作系统:Debian 9
  • Web服务器:Apache
  • 来自的证书https://www.sslforfree.com/

当我尝试使用外部客户端通过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

Node 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,但可以从web浏览器访问该网站,SSL证书似乎运行良好。

SMTP和STARTTLS

有两种加密SMTP的方式:端口465上的SMTP,它首先建立TLS握手,然后启动SMTP会话;端口587上的带有STARTTLS的SMTP,首先启动SMTP会话,然后在STARTTLSSMTP命令后初始化TLS(然后从身份验证和要保护的一切开始)。

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

使用Nodemailer强制加密

nodemailer的secure标志仅用于指示SMTP之前的TLS,这也由行后的注释指示(该注释还明确解释了要使用的设置)。

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

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

  • options.secure如果true,则连接将仅使用TLS。如果false(默认值),TLS仍可以通过STARTTLS命令升级到可用状态。

  • […]

  • options.requireTLS如果这是true,而securefalse,它会强制Nodemailer使用STARTTLS,即使服务器没有公布对它的支持。

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

代码中的注释已经指出了问题,因为端口587 的secure应该设置为false

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

同样适用于明确表示:的文档

secure–如果为true,则连接到服务器时将使用TLS。如果为false(默认值),则如果服务器支持STARTTLS扩展,则使用TLS。在大多数情况下,如果连接到端口465,请将此值设置为true对于端口587或25,保持为false

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

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

requireTLS–如果这是真的,而secure是假的,则Nodemailer会尝试使用STARTTLS,即使服务器没有宣布支持它。如果连接无法加密,则不会发送消息

最新更新