升级后邮件发送功能无法使用

几天前,我将 Discourse 从某个我不确定的版本(但我强烈怀疑,尽管不能百分之百确定,是 2.4 beta 版本)升级到了当前的 2.4.0.beta4。

最近我注意到邮件发送功能不再正常工作,Sidekiq 中有大量失败的任务。所有这些任务的错误信息均为:“Jobs::HandledExceptionWrapper: Wrapped OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=error: unsupported protocol”。

我的邮件设置指向我的一台旧邮件服务器(该服务器对其他各类客户端均正常工作),使用端口 587,采用普通身份验证,并将 enable_starttls_auto 设置为 true。自今年早些时候我搭建 Discourse 以来,一切运行正常,因此我相当确定问题出在最近几次升级之后。在此期间,操作系统和邮件服务器均未更改或升级。

我已阅读 https://meta.discourse.org/t/discourse-version-2-4/108194,但其中并未提及任何与邮件或 OpenSSL 相关的内容。

问题 1:在哪里可以查看上一次升级以及再前一次升级是从哪个版本开始的,以便我追踪所使用的版本历史?

问题 2:在哪里可以找到邮件任务开始失败的具体时间戳?我在 Sidekiq 中点击了一个任务,它显示该任务创建于两天前,这与我进行升级的时间大致吻合。但我希望确认在此之前的邮件任务并未失败。

问题 3:推测在我开始运行的版本(相对于之前运行的版本)中,某些与 OpenSSL 相关的内容发生了变化。这可能是什么变化?是否有某个设置可以调整?或者我是否应该尝试降级?又或者,是否有办法从任务处理过程中获取更多信息,以便查看它具体在抱怨哪种协议?

这是给你的 @gerhard :wink:

你能尝试从 Docker 容器内部连接到 SMTP 服务器吗?

openssl s_client -connect <hostname>:<port> -starttls smtp

它能正常工作吗?它选择了哪个协议?在输出的末尾你应该会看到类似以下内容:

SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES128-GCM-SHA256

或者当使用 TLS 1.3 时:

New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384

以下是 Docker 中的四次运行结果:

root@foo-app:/# openssl s_client -connect mail.foo.com:587 -starttls smtp
CONNECTED(00000003)
139861698753664:error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol:../ssl/statem/statem_lib.c:1922:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 320 bytes and written 353 bytes
Verification: OK
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---
root@foo-app:/#
root@foo-app:/#
root@foo-app:/# openssl s_client -connect mail.foo.com:587 -starttls smtp -tls1_1
CONNECTED(00000003)
140427988595840:error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol:../ssl/statem/statem_lib.c:1922:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 320 bytes and written 174 bytes
Verification: OK
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.1
    Cipher    : 0000
    Session-ID:
    Session-ID-ctx:
    Master-Key:
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1568985038
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
    Extended master secret: no
---
root@foo-app:/#
root@foo-app:/#
root@foo-app:/# openssl s_client -connect mail.foo.com:587 -starttls smtp -tls1_2
CONNECTED(00000003)
140184139936896:error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol:../ssl/statem/statem_lib.c:1922:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 320 bytes and written 258 bytes
Verification: OK
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : 0000
    Session-ID:
    Session-ID-ctx:
    Master-Key:
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1568985044
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
    Extended master secret: no
---
root@foo-app:/#
root@foo-app:/#
root@foo-app:/# openssl s_client -connect mail.foo.com:587 -starttls smtp -tls1_3
CONNECTED(00000003)
write:errno=0
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 262 bytes and written 278 bytes
Verification: OK
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---
root@foo-app:/#

当我强制使用 TLS 1.3 以外的版本时(通过向 openssl 命令添加额外参数,见下文),会看到“协议不支持”的错误消息;而仅在强制使用 TLS 1.3 时,才会看到“write:errno=0”。使用您的命令(不强制指定 TLS 版本)时,我没有看到任何特定版本被使用或尝试。

如果有人能回答第 1 和第 2 个问题,那将非常有帮助。我需要考虑是否有办法尽快降级,为此我需要知道最后一个正常工作的版本是什么。

我现在有 3682 封失败的邮件任务在队列中。账户创建验证邮件无法发送,其他邮件也无法发送。

请编辑 /var/discourse/launcher,将第 91 行中的基础镜像版本 image="discourse/base:2.0.20190906-0522" 替换为 image="discourse/base:2.0.20190625-0946"

之后重建容器,并运行您在 E-mail sending not working after upgrade - #4 by rawtaz 中执行过的命令。TLS 1.3 无法工作,但其他命令的输出是否相似?如果不相似,有哪些不同之处?

如果 SMTP 主机名是公开可用的,能否通过私信(PM)提供给我?

谢谢 @gerhard!你的建议解决了问题。我更改了基础镜像版本并重新构建,论坛立刻就开始发送排队中的邮件了(大约 1 万封 :D)。

我再次在容器中运行了命令,得到了其他(成功的)输出。该输出包含证书和其他一堆内容,除非你真的需要,否则我宁愿不把它贴在这里。如果这有问题,或者你真的需要它,请告诉我。

我会私信你邮件服务器的主机名,以便你更详细地调试这个问题——请保密 :slight_smile: 谢谢!

编辑:我将你的上一条帖子标记为解决方案,因为它解决了问题。不过显然我们需要找出导致新版本基础镜像出现问题的原因,以便未来能够更新。

是的,继续使用旧镜像并不是长久之计。该镜像实际上已不再受支持,问题可能会逐渐出现……

此问题与 Email SSL Errors after Update to 2.4.0.beta4 类似。建议您将 SMTP 更新为使用 TLSv1.2,并将 DH 密钥大小设置为至少 2048 位。

作为临时解决方案,您应该能够在 app.yml 末尾的 run 部分添加 sed 命令,从 /etc/ssl/openssl.cnf 文件中删除以下两个设置:

MinProtocol = TLSv1.2
CipherString = DEFAULT@SECLEVEL=2