我在 Debian 9 机器上运行 Postfix,并安装了 opendkim(均来自 Debian 存储库)。milter 套接字/连接是 inet:localhost:8892,iptables 防火墙允许该连接(成功telnet localhost 8892
)。
但是,只有当我从控制台发送电子邮件时(使用mail -s "testing DKIM" my-address@not-the-same-domain
),我才能收到签名消息,而当我从 Thunderbird 发送电子邮件时,则不会收到签名消息。请注意,使用 Thunderbird 时,我使用 ssh 隧道,因此邮件服务器会将连接视为来自本地主机。(即,在我的桌面上,我运行ssh -Llocalhost:2525:my-server:25 tunnel@my-server
,并告诉 Thunderbird 外发邮件服务器是本地主机,端口为 2525。
这是我从控制台发送时获得的签名的示例:
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=[omitted -- but it shows the correct domain];
s=mail; t=1557228588;
bh=slJTHzrIw+6TkIIPpFmGER34xtLwMLZ2md99gvHoFTE=;
h=To:Subject:Date:From:From;
b=jtOM5OOM83l [ ··· several lines of "gibberish" ··· ] 4qdpSt4l86DEA==
对于导致此问题的原因您有什么想法吗?
[[编辑]]问题变得更加令人费解。在检查日志时,我注意到一条警告external host XXXX.my-service-provider.com
试图发送为my-domain.com
我调整了/etc/hosts
……/etc/hostname
最后我意识到我必须调整反向 DNS 查找,然后我就这么做了。现在,该命令hostname
以 FQDN(我为其配置 DKIM 的正确域)响应。
现在,/var/log/syslog
当我发送电子邮件时,我收到了消息external host *the-correct-FQDN* attempted to send as *the-correct-FQDN*
。并且传输的消息不包含 DKIM 签名。
如果我这样做telnet localhost 25
,请使用 来迎接 SMTP 服务器helo the-correct-FQDN
,该消息是 DKIM 签名的;日志显示来自的连接localhost (127.0.0.1)
负责传输。
有任何想法吗?
[[ 编辑结束 ]]
答案1
事实证明,该问题是由于缺少 InternalHosts 参数引起的。对于 Debian 9 (2.11) 上的当前版本的 opendkim,我按如下方式解决了此问题:
编辑文件/etc/opendkim.conf
并添加以下行:
InternalHosts file:/etc/opendkim-trustedhosts.conf
然后,该文件/etc/opendkim-trustedhosts.conf
包含:
127.0.0.1
x.x.x.x (the actual public IP of the server)
瞧 --- 重新启动,问题就解决了!
我注意到与我在那里找到的其他信息有一些不同 --- 据我所知,在 CentOS 上(不确定是否是旧版本还是仍然这样),默认配置是:有一个目录etc/opendkim
,并且该目录中有一个文件TrustedHosts.conf
;该文件/etc/opendkim.conf
已经有InternalHosts
指向 TrustedHosts 文件的指令。在 Debian 9 上,必须手动创建它。
答案2
类似的问题和背景:使用 openDKIM 和 Postfix 作为 MTA,然后仅对经过身份验证的邮件用户代理(MUA)进行中继,后者特别指配置了 SMTP+POP 或 SMTP+IMAP 连接的 MS-Outlook 客户端,通过 TLS/SSL+SASL(使用登录名和密码进行身份验证)通过端口 587 连接到 Postfix MTA。
当使用本地控制台“mailx”或“sendmail”时,openDKIM 集成通过non_smtpd_milters选择postfix/main.cf, 然而smtpd_milters选项控制来自经过身份验证的 MUA 的传入 SMTPD 电子邮件的大小写。因此,首先您可能需要检查两个选项是否一致,例如
smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = $smtpd_milters
然后,当为本地电子邮件(通过“mailx”或“sendmail”)生成有效的 DKIM 签名,但未在经过身份验证的 MUA 的电子邮件上生成有效 DKIM 签名时,很可能存在确定谁是邮件发件人的问题,从而阻止 openDKIM 爬取到为其设置签名的“发件人:”域。您可能会发现类似以下痕迹:
opendkim[9530]: E3B6A13CBED: can't determine message sender;
对我来说,这是由于干扰了header_checksPostfix 中的选项。在 main.cf 或 master.cf(可以覆盖 main.cf 中的选项)中查找它,例如
-o header_checks=regexp:/etc/postfix/submission_header_cleanup
并确保相关的报头清理规则将不是包含如下正则表达式:
/^Received:/ IGNORE
然后您必须将其注释掉或者删除。
最后,确保postfix/main.cf将告诉 Postfix 通过 milter 协议向 opendkim 传递足够的数据,选项如下:
milter_mail_macros = i {mail_addr} {client_addr} {client_name} {auth_type} {auth_authen}