我能够使用 OPENDKIM 的 KeyTables 和 SigningTable 为多个域设置单个 DKIM 密钥。但自从公司开始使用 RSPAMD 以来,我就不能再同时使用 OPENDKIM 和 RSPAMD 了,而是需要使用 RSPAMD 的 DKIM 签名模块。
说来话长,但我最终遇到了这种情况,我需要为其他公司品牌域名设置单个 DKIM 密钥。通常,我会在 OPENDKIM 中执行此操作:
*@maincorp.com mail._domainkey.maincorp.com
*@brand1.com mail._domainkey.maincorp.com
*@brand2.com mail._domainkey.maincorp.com
但是,如何在 RSPAMD DKIM 签名中做到这一点?我浏览并使用 RSPAMD 文档尝试了几种方法,但都没有成功。是否可以像在 OPENDKIM 中一样,在 RSPAMD 中为多个域 DKIM 签名使用单个 DKIM 密钥?
请注意,到目前为止,我的试用情况如下:
到目前为止,1 对 1 方案(即对不同域使用不同 DKIM 密钥的 DKIM 签名)是可行的。但我需要 1 对 N 方案,即多个域使用 1 个 DKIM 密钥。
备注:
- 我明白,我可以为每个品牌域名添加指向 maincorp.com _domainkey 的 CNAME 记录。但是,每个品牌域名都是在另一个国家域名注册商处注册的,我无法立即访问它(这将是一个相当漫长的官僚程序),因此这不太可能。
- 我一直在使用 Opendkim 和 Spamassassin,并将此事指定为 1 号,运行良好,但现在 Spamassassin 已被 RSPAMD 取代,并且 Opendkim 不再使用。
谢谢你,
托马斯
供您参考,这是我在 local.d/dkim_signing.conf 中的 DKIM 签名配置:
我的local.d/dkim_signing.conf:
enabled = true;
If false, messages with empty envelope from are not signed
allow_envfrom_empty = true;
# If true, envelope/header domain mismatch is ignored
allow_hdrfrom_mismatch = false;
# If true, multiple from headers are allowed (but only first is used)
allow_hdrfrom_multiple = false;
# If true, username does not need to contain matching domain
allow_username_mismatch = true;
# If false, messages from authenticated users are not selected for signing
auth_only = true;
# Default path to key, can include '$domain' and '$selector' variables
#path = "/etc/opendkim/userkeys/$domain/$selector.private";
path = "/etc/opendkim/keys/mailcorp.com/mail.private";
# Default selector to use
#selector = "default";
selector = "mail";
# If false, messages from local networks are not selected for signing
sign_local = true;
# Map file of IP addresses/subnets to consider for signing
# sign_networks = "/some/file"; # or url
# Symbol to add when message is signed
symbol = "DKIM_SIGNED";
# Whether to fallback to global config
try_fallback = false;
selector_map = "/etc/rspamd/dkim_selectors.map";
path_map = "/etc/rspamd/dkim_paths.map";
# Domain to use for DKIM signing: can be "header" (MIME From), "envelope" (SMTP From) or "auth" (SMTP username)
use_domain = "header";
# Domain to use for DKIM signing when sender is in sign_networks ("header"/"envelope"/"auth")
use_domain_sign_networks = "header";
# Domain to use for DKIM signing when sender is a local IP ("header"/"envelope"/"auth")
use_domain_sign_local = "header";
# Whether to normalise domains to eSLD
use_esld = false;
# Whether to get keys from Redis
# Not using redis, keys coming from files in /etc/opendkim
use_redis = false;
# Hash for DKIM keys in Redis
key_prefix = "DKIM_KEYS";
我的 /etc/rspamd/dkim_selectors.map:
maincorp.com mail
brand1.com mail
brand2.com mail
还有我的 /etc/rspamd/dkim_paths.map:
maincorp.com /etc/opendkim/keys/mancorp.com/mail.private
brand1.com /etc/opendkim/keys/mancorp.com/mail.private
brand2.com /etc/opendkim/keys/mancorp.com/mail.private
在 local.d/dkim_signing.conf 使用上述配置,结果如下:
- 当电子邮件从 @mailcorp.com 发送时,它没有问题,DKIM 将被签名。为什么?因为在 DNS mailcorp.com 上它有 _domainkey。
- 但是,当从 @brand1.com 和 @brand2.com 发送电子邮件时,DKIM 将不会被签名,除非我在 brand1.com 和 brand2.com 中添加 CNAME 记录,而我第一次并不想这样做。
需要做什么(主要目标),使用上述配置尚未实现,我需要您的帮助:
目标是能够为 brand1.com 和 brand2.com 签名已在 maincorp.com 中的 TXT 记录中实现的现有单个 DKIM 密钥,而无需在每个 brand1.com 和 brand2.com DNS 面板中添加 CNAME 或 TXT 记录 _domainkey。
对于 maincorp.com,它已经可以正常工作,因为它在 DNS 面板中具有 mail._domainkey.maincorp.com 的 TXT 记录。但对于 brand1.com 和 brand2.com,它不起作用。
请帮忙...
更新时间:2019 年 4 月 9 日:
我发现我需要的这个功能不幸尚未被 RSPAMD 支持,至少在提出这个问题时是这样。好吧,希望他们能启用它。
因此,现在,我只需要向 brand1.com 和 brand2.com 添加 CNAME 记录,这样 DKIM 就会有效且已签名 :(。
非常感谢您的耐心和帮助!祝您有美好的一天!
答案1
为了让遇到相同问题的人更容易理解。下面是一个如何使用密钥和签名表的示例,如上文评论中所述,以便您可以对每个来自域进行签名,并使用来自您的域的选择器,而不是来自域的选择器:
key_table = [
"maincorp.com maincorp.com:dkim:/var/lib/rspamd/dkim/dkim.key"
];
signing_table = [
"*@maincorp.com maincorp.com",
"*@brand1.com maincorp.com",
"*@brand2.com maincorp.com"
];
或者只对每个域名进行签名
signing_table = [
"* maincorp.com",
];
这将产生以下 dkim 签名:
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=maincorp.com;
s=dkim; t=[...];
h=from:from:reply-to:subject:subject:date:date:message-id:message-id:to:
cc; bh=[...];
b=[...]