我使用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会话,然后在STARTTLS
SMTP命令后初始化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
,而secure
是false
,它会强制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,即使服务器没有宣布支持它。如果连接无法加密,则不会发送消息