我在使用 postfix、DKIM 和转发邮件时遇到了问题。在几乎每篇关于 DKIM 的文章中,我都看到“如果我不修改邮件头中的任何字段,DKIM 签名在转发后应该仍然有效”。不幸的是,我的情况并非如此。
我的配置包括一个隐藏在防火墙后面的 MS Exchange 服务器,以及一个位于 Exchange 服务器和 Internet 之间的带有 postfix 和 opendkim(以及 opendmarc)的中间 Linux 机器。
当外部用户(比如[电子邮件保护])向内部用户发送消息(例如[电子邮件保护]),它首先到达我的 postfix linux 机器,在那里验证 DKIM 签名,然后成功转发到内部 Exchange 服务器。从 Exchange 服务器发送的重放经过同一个 linux/postfix 机器,这次添加了 DKIM 签名。因此,从 mydomain.com 发送或发往它的邮件一切正常。但是当用户在他的 Exchange 帐户上启用 ([电子邮件保护])将所有收到的邮件转发到外部邮箱(例如[电子邮件保护])然后 linux/postfix 框看到[电子邮件保护]在发件人:字段中并尝试验证 DKIM 签名,这显然会失败。以下是这种情况的示例日志:
2024-01-08T13:00:42.599247+01:00 myserver postfix/smtpd[11432]: 9242D1E00DE: client=unknown[10.0.0.1]
2024-01-08T13:00:42.601628+01:00 myserver postfix/cleanup[11423]: 9242D1E00DE: warning: header Subject: =?utf-8?B?VcW8eXRrb3duaWsgU3p5bWHFhHNrYSBvcHVibGlrb3dhxYIgd2lhZG9tb8Wb?=? =?utf-8?B?xIc=?= from unknown[10.0.0.1]; from=<[email protected]> to=<[email protected]> proto=ESMTP helo=<smtp.mydomain.com>
2024-01-08T13:00:42.601745+01:00 myserver postfix/cleanup[11423]: 9242D1E00DE: message-id=<[email protected]>
2024-01-08T13:00:42.606954+01:00 myserver opendkim[975]: 9242D1E00DE: no signing domain match for 'source.domain.com'
2024-01-08T13:00:42.607061+01:00 myserver opendkim[975]: 9242D1E00DE: no signing subdomain match for 'source.domain.com'
2024-01-08T13:00:42.609717+01:00 myserver opendkim[975]: 9242D1E00DE: s=selector2 d=source.domain.com a=rsa-sha256 SSL error:02000068:rsa routines::bad signature
2024-01-08T13:00:42.609953+01:00 myserver opendkim[975]: 9242D1E00DE: bad signature data
2024-01-08T13:00:42.610192+01:00 myserver postfix/cleanup[11423]: 9242D1E00DE: milter-reject: END-OF-MESSAGE from unknown[10.0.0.1]: 5.7.0 bad DKIM signature data; from=<[email protected]> to=<[email protected]> proto=ESMTP helo=<smtp.mydomain.com>
我该如何解决这个问题?(我的内部 Exchange 服务器的 IP 当然列在 InternalHost 中)。我应该尝试使用 mydomain.com 密钥对此类消息进行签名(而不是)还是只允许将其不加修改地通过我的 linux/postfix 框?第二个选项似乎是正确的,但我不知道如何实现这一点。
答案1
#!/bin/bash
# Backup configuration files
cp /etc/postfix/main.cf /etc/postfix/main.cf.bak
cp /etc/opendkim.conf /etc/opendkim.conf.bak
# Modify Postfix configuration to always add missing headers
echo "always_add_missing_headers = yes" >> /etc/postfix/main.cf
# Restart Postfix
systemctl restart postfix
# Review and update DKIM configuration (replace 'source.domain.com' with your actual domain)
sed -i 's/^Domain.*$/Domain source.domain.com/' /etc/opendkim.conf
# Restart OpenDKIM
systemctl restart opendkim
# Test DKIM signing on a forwarded message (replace 'forwarded_message.eml' with your actual file)
opendkim-testmsg < forwarded_message.eml
# Monitor logs for any errors
journalctl -u postfix -u opendkim -e
echo "Script execution completed."
此脚本包括备份配置文件、修改 Postfix 设置、更新 OpenDKIM 配置、重启服务以及对转发消息执行 DKIM 测试的步骤。将占位符值(例如“source.domain.com”、“forwarded_message.eml”)替换为您的实际域和文件。检查您的 OpenDKIM 配置(例如 /etc/opendkim.conf)并确保签名域 (d=) 设置正确。验证期间签名域似乎不匹配。
答案2
您可以尝试将 postfix 配置为中继主机。这将允许电子邮件在不被 postfix 修改的情况下被转发。为此,您可以将以下行添加到 postfix 配置文件中:
relayhost = [internal.exchange.server.ip.address]
smtp_generic_maps = hash:/etc/postfix/generic
将 [internal.exchange.server.ip.address] 替换为您内部 Exchange 服务器的 IP 地址。然后,在 /etc/postfix 目录中创建一个名为 generic 的文件并添加以下行: 这将告诉 postfix 将来自 source.domain.com 域的电子邮件中的发件人:地址替换为@source.domain.com [email protected]
[电子邮件保护],这样邮件就可以直接通过,不会被 postfix 修改,也不会导致 DKIM 签名验证失败。建议您测试一下,看看是否有效。