从Nodemailer到Postfix的encryption连接失败,并显示“SSL23_GET_SERVER_HELLO:unknown protocol”

我使用Postfix和Dovecotconfiguration了一个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 

节点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,但网站可以从networking浏览器访问就好了,SSL证书似乎工作正常。

SMTP和STARTTLS

有两种encryption的SMTP方式:端口465上的SMTP,首先build立TLS握手,然后启动SMTP会话,以及端口587上带有STARTTLS的SMTP(首先启动SMTP会话),然后在STARTTLS SMTP命令(和然后从身份validation开始并保护所有内容)。

SMTP(首先是TLS,端口465)被认为是弃用的; 与STARTTLS(端口587)标准符合SMTP并不意味着安全或隐私的任何缺点。 正确configuration的SMTP服务器将不允许SMTP提交端口上的任何不安全的连接。

使用Nodemailer强制encryption

nodemailer的secure标志只是表示SMTP之前的TLS,也是由该行后面的注释(也明确解释了使用什么设置)指示的。

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

查看Nodemailer文档 ,有关configuration选项的更多信息:

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

  • […]

  • options.requireTLS如果这是true并且securefalse ,则强制Nodemailer使用STARTTLS,即使服务器不支持它也是如此。

换句话说,要遵循标准和最佳实践来执行encryption会话,请设置requireTLS而不是secure并在端口587上使用SMTP提交。

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

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

对于清楚说明的文档也是如此:

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

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

如果你想使用明确的TLS(端口587),但也确保TLS不是可选的使用requireTLS的logging:

requireTLS – 如果这是真的,并且安全性为false,那么即使服务器没有为其支持,Nodemailer也会尝试使用STARTTLS。 如果连接不能encryption,则不发送消息

Interesting Posts