从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
并且secure
为false
,则强制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,则不发送消息