直接投递:传入邮件的 LetsEncrypt 失败(prop.ltcmp.net.key 错误)及由此导致的投递失败?

当我按照此说明使用直接交付的邮件接收设置时,日志中会出现以下错误,其中包括 Let’s Encrypt 的故障以及来自 Gmail 账户发往 “nobody@discourse.domain.tld” 的测试邮件:

<22> postfix/master[1]: daemon started -- version 3.1.1, configuration /etc/postfix
<20> postfix/smtpd[97]: warning: cannot get RSA private key from file "/letsencrypt/domain.tld/prop.ltcmp.net.key": disabling TLS support
<20> postfix/smtpd[97]: warning: TLS library problem: error:02001002:system library:fopen:No such file or directory:bss_file.c:402:fopen('/letsencrypt/domain.tld/prop.ltcmp.net.key','r'):
<20> postfix/smtpd[97]: warning: TLS library problem: error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:404:
<20> postfix/smtpd[97]: warning: TLS library problem: error:140B0002:SSL routines:SSL_CTX_use_PrivateKey_file:system lib:ssl_rsa.c:633:
<22> postfix/smtpd[97]: connect from mail-qk1-f180.google.com[209.85.222.180]
<22> postfix/smtpd[97]: lost connection after STARTTLS from mail-qk1-f180.google.com[209.85.222.180]
<22> postfix/cleanup[101]: 20A0CBCE22: message-id=<20191115221116.20A0CBCE22@discourse-mail-receiver.localdomain>
<22> postfix/qmgr[83]: 20A0CBCE22: from=<double-bounce@discourse-mail-receiver.localdomain>, size=900, nrcpt=1 (queue active)
<22> postfix/smtpd[97]: disconnect from mail-qk1-f180.google.com[209.85.222.180] ehlo=1 starttls=0/1 commands=1/2
<22> postfix/smtp[103]: 20A0CBCE22: to=<postmaster@discourse-mail-receiver.localdomain>, orig_to=<postmaster>, relay=none, delay=0.01, delays=0.01/0/0/0, dsn=5.4.4, status=bounced (Name service error for name=discourse-mail-receiver.localdomain type=AAAA: Malformed or unexpected name server reply)
<20> postfix/bounce[104]: warning: 20A0CBCE22: undeliverable postmaster notification discarded
<22> postfix/qmgr[83]: 20A0CBCE22: removed

我的配置情况是:我在 mail.domain.tld 上确实有另一个邮件服务器,但 Discourse 直接运行在 domain.tld 上。discourse.domain.tld 也是运行 Discourse 和 mail-receiver 容器的 Docker 服务器的主机名。

我还有以下 MX 记录:

domain.tld > mail.domain.tld            priority: 10
d > discourse.domain.tld                priority: 20
domain.tld > discourse.domain.tld       priority: 30

这里可能出了什么问题?

我注意到的一个明显问题是,文件夹中缺少 /letsencrypt/domain.tld/prop.ltcmp.net.key

discourse-mail-receiver:/# ls -tlrha letsencrypt/domain.tld
total 40
-rw-r--r--    1 root     root        3.2K Nov 10 05:10 domain.tld.key
-rw-r--r--    1 root     root         208 Nov 10 05:10 domain.tld.csr.conf
-rw-r--r--    1 root     root        1.6K Nov 10 05:10 domain.tld.csr
-rw-r--r--    1 root     root        2.2K Nov 10 05:10 domain.tld.cer
-rw-r--r--    1 root     root        3.8K Nov 10 05:10 fullchain.cer
-rw-r--r--    1 root     root        1.6K Nov 10 05:10 ca.cer
drwxr-xr-x    3 root     root        4.0K Nov 10 05:10 .
-rw-r--r--    1 root     root         799 Nov 11 15:56 domain.tld.conf
drwxr-xr-x    2 root     root        4.0K Nov 11 27 15:56 backup
drwxr-xr-x    8 root     root        4.0K Nov 16 00:49 ..

这很有趣,因为这可以追溯到 @surety 提出的 这个问题,但似乎一直没有得到直接的回答。

该线程似乎仍在讨论这一点,但现在那里的讨论内容太多,容易让人混淆,因此我在此创建了一个主题(以便未来遇到类似问题的用户能更清晰地理解)。

看起来 mail-receiver.yml 配置中 POSTCONF_smtpd_tls_key_file 的值 /letsencrypt/domain.tld/prop.ltcmp.net.key 必须替换为 /letsencrypt/domain.tld/domain.tld.key

因此,对 @surety 的第 1 个问题的回答是“是的”,将该条目的内容替换为您所看到的内容是正确的。第 2 个问题似乎也正确,保持默认即可。

我认为 @pfaffman@mpalmer 或许应该重新调整容器创建脚本,使其使用正确的 .key 文件,而不是这个(看似错误的)prop.ltcmp.net.key 条目…

目前,我很幸运地能够继续推进 @mpalmer 的步骤:

您现在也可以尝试向 nobody@forum.example.com 发送一封电子邮件。虽然 Discourse 目前还不会对它做任何 有用 的处理,但您发送的邮件应该在几秒钟内出现在管理面板的“邮件”>“已拒绝”列表中。如果发生这种情况,您就 绝对 准备好继续下一步了。

因为现在我的测试邮件已经出现在 Discourse 的 /admin/email/rejected 列表中了! :slight_smile:

我认为很明显,prop.ltcmp.net 只是一个占位符,就像 domain.tld 一样。

在迁移到 Debian 和启用新邮件接收器之间,可能还需要进行一些其他更改。我将在接下来的几天内尝试查看,因为我的安装脚本可能已被这些更新破坏。

有意思,为什么你认为这显然被视为只是一个占位符?缩写词应该是不言自明的吗?如果是这样,那么也许我们可以用更明显的方式来表达,例如:<REPLACE_THIS_WITH_LETSENCRYPT_DOT.KEY_FILE_PATH.key>