从Nodemailer到Postfix的加密连接失败,出现“SSL23_GET_SERVER_HELLO:未知协议”

时间:2017-10-31 18:16:21

标签: node.js ssl smtp postfix dovecot

我使用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证书似乎工作正常。

2 个答案:

答案 0 :(得分:1)

SMTPs和STARTTLS

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

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

使用Nodemailer

实施加密

nodemailer的STARTTLS标志仅用于表示SMTP之前的TLS,这也是该行后面的注释所表示的(也明确说明了要使用的设置)。

secure

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

  
      
  • secure: true, // secure:true for port 465, secure:false for port 587 如果options.secure连接只使用TLS。如果true(默认值),则可通过STARTTLS命令将TLS升级为可用。

  •   
  • [...]

  •   
  • false如果这是options.requireTLStruesecure,它会强制Nodemailer使用STARTTLS,即使服务器不宣传对它的支持。< / p>

  •   

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

答案 1 :(得分:0)

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

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

the documentation同样如此:

  

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

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

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

  

requireTLS - 如果这是真的且安全性为假,那么即使服务器不宣传对它的支持,Nodemailer也会尝试使用STARTTLS。如果连接无法加密,则不会发送消息