Gmail以及本地ISP通过DKIM的Exim电子邮件,但微软没有,在标题中注明失败:
Authentication-Results: spf=pass (sender IP is[正确IP])smtp。mailfrom =(正确的域).co.uk;outlook.com;dkim=fail(签名失败)不验证)头。d =(正确的域),outlook.com;Dmarc =bestguesspass action=none header.from=[正确的域名];
我已经试过了:
我通过Google Apps (G Suite)电子邮件(使用不同的DKIM选择器,即另一个DNS TXT记录中的另一个公钥)从同一域向outlook发送了一封电子邮件,以比较消息来源- Google的消息传递DKIM。
我注意到两件事:
-
Google在"h"标记,所以我重新配置了Exim,也正好使用这些,但无济于事。
-
Google在"h"标记,而Exim没有,即使我在Exim的配置中以小写输入它们。我读到,在生成头签名哈希时,头名称应该是小写的,但文本并没有说明同样适用于"h"标签(http://dkimcore.org/specification.html章节3.2),但谷歌似乎这样做。我想在Exim中重写这个会很困难吧?
我还注意到,除了在"h"的差异,DKIM-Signature头结构是完全相同的,除了一些空白的差异(exim一个也只有空格和分号分隔符后的新行,所以它看起来很好,它只是打破不同)。起初,我认为也许Exim没有设置一些必需的标签,但在这种情况下,错误应该是不同的。
Exim Version: 4.87运行在cPanel 11 centOS 7.2服务器上Exim DKIM配置:
dkim_remote_smtp:
driver = smtp
interface = <; ${if exists {/etc/mailips}{${lookup{${lc:$sender_address_domain}}lsearch{/etc/maili
ps}{$value}{${lookup{${lc:$sender_address_domain}}lsearch{/etc/mailips}{$value}{${lookup{${perl{get_
sender_from_uid}}}lsearch*{/etc/mailips}{$value}{}}}}}}}}
helo_data = ${if exists {/etc/mailhelo}{${lookup{${lc:$sender_address_domain}}lsearch{/etc/mailhel
o}{$value}{${lookup{${lc:$sender_address_domain}}lsearch{/etc/mailhelo}{$value}{${lookup{${perl{get_
sender_from_uid}}}lsearch*{/etc/mailhelo}{$value}{$primary_hostname}}}}}}}{$primary_hostname}}
dkim_domain = ${lc:$sender_address_domain}
dkim_selector = default
dkim_private_key = "/var/cpanel/domain_keys/private/${dkim_domain}"
dkim_canon = relaxed
dkim_sign_headers = to:from:subject:message-id:date:user-agent:mime-version:content-transfer-encoding
(最后一行是我加的——之前都不行)
由于这个错误似乎与签名验证特别相关,我不认为以下是相关的,但我还是包括了它:
Exim电子邮件是由服务器上的nobody先生发送的,但是envelope-from和Return-Path标头是预期发件人的正确电子邮件地址。在这个区域应该不会有任何问题,因为SPF即使在MS上也是合格的。
而来自Google的邮件有
问题:& lt; (id) @(发送方的域)在
Exim发送的邮件有
问题:& lt; (id) @(服务器主机名)在
任何帮助/想法吗?
哇,真幸运!在发帖之前,我在无望地搜索Exim的用户邮件列表时,很偶然地找到了答案。我打开的一个公告消息也被发布到exim-dev,所以在底部的存档查看器显示了这个邮件列表中的前一条消息,这恰好是关于一个旧的,已解决的DKIM错误"dkim_sign_headers中包含的头不在签名中,当不在消息中"。
然而,这给了我一个想法,从dkim_sign_headers中排除不在我的Exim生成的电子邮件中的标题…它起作用了:)
dkim=pass(签名已验证)
似乎DKIM签名应该使用在"h"标签中指定的不存在的标头来计算,以便在随后添加到电子邮件中使签名失败(具有一定的安全意义),所以我的猜测是MS搞砸了计算,但我不确定。
有了@lm713的答案,我在exim配置文件中开始工作。我是这样做的:
-
查看头部并查看DKIM记录发送的内容。在我的例子中是这样的:
from user by server.domain.com with local (Exim 4.83) (envelope-from) id xx-0000123-0K;2018年3月19日星期一21:04:41 +0100
-
通过SSH:进入exim.dkim.conf文件。你可以在这里找到它:/etc/exim.dkim.conf。如果你没有它并使用DirectAdmin,请遵循以下教程:https://help.directadmin.com/item.php?id=569
-
在文件中添加以"dkim_sign_headers = "开头的额外行
-
查看您的头DKIM记录并命名您看到的元素。在我的例子中是:
from user by server.domain.com with local (Exim 4.83) (envelope-from) id xx-0000123-0K;2018年3月19日星期一21:04:41 +0100
所以我写:dkim_sign_headers = from:user-agent:message-id:date
- 在ssh中输入此类型后:service exim restart