【问题标题】:Encrypted connection from Nodemailer to Postfix fails with "SSL23_GET_SERVER_HELLO:unknown protocol"从 Nodemailer 到 Postfix 的加密连接因“SSL23_GET_SERVER_HELLO:unknown protocol”而失败
【发布时间】:2018-04-13 00:23:51
【问题描述】:

我使用 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

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,但可以从网络浏览器访问该网站,而且 SSL 证书似乎工作正常。

【问题讨论】:

  • SSL 已弃用,TLS 是当前标准(并取代 SSL)。此外,它是 TLS certificates,而不是 licenses。证书证明身份,您不需要权限即可执行 TLS。

标签: node.js ssl smtp postfix dovecot


【解决方案1】:

您代码中的注释已经指出了问题,因为端口 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,请将其设置为 false

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

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

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

【讨论】:

    【解决方案2】:

    SMTP 和 STARTTLS

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

    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 documentation,有更多关于配置选项的信息:​​

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

    • [...]

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-22
      • 2020-05-30
      • 1970-01-01
      • 2020-01-26
      • 2023-03-14
      • 2020-02-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多