Exim的DKIM签名在微软服务器(Outlook,Hotmail)上*仅限*无法验证。

4

Gmail和本地ISP通过Exim邮件的DKIM认证,但微软未能通过,在头部注明了失败:

Authentication-Results: spf=pass(发件人IP为[正确的IP]) smtp.mailfrom=[correct domain].co.uk; outlook.com; dkim=fail(签名未验证通过) header.d=[correct domain];outlook.com; dmarc=bestguesspass action=none header.from=[correct domain];

我尝试过:

我通过Google Apps(G Suite)电子邮件从同一域向Outlook发送电子邮件(使用不同的DKIM选择器,即另一个公钥在另一个DNS TXT记录中),以比较消息来源。Google的消息通过了DKIM。

我注意到两件事:

  1. Google在"h"标签中包含的头文件要少得多,因此我重新配置了Exim,也使用了这些精确的头文件,但是没有成功。

  2. Google在"h"标签中以小写字母包含头文件名称,而Exim则不是,即使我在Exim的配置中输入它们时使用小写字母。我读到在生成

    时应该将头文件名称转换为小写字母,但是文本没有说明同样适用于"h"标签中的头文件名称(http://dkimcore.org/specification.html第3.2节),但是Google似乎是这样做的。我想在Exim中覆盖这个可能会很难吧?

我还注意到除了"h"中的差异之外,DKIM-Signature头结构在两者中完全相同,除了一些空格差异(Exim只在分号分隔符后有空格和新行,所以看起来没问题,只是分割方式不同)。起初我以为Exim没有设置一些必需的标签,但在这种情况下错误应该是不同的。

Exim版本: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电子邮件是由服务器上的Mr nobody发送的,但信封发件人和Return-Path标题是预期发件人的正确电子邮件地址。在这个领域不应该有任何问题,因为即使在MS上SPF也通过了。

虽然从Google发送的电子邮件有

Message-ID: <[id]@[sender's domain]>

Exim发送的电子邮件有

Message-ID: <[id]@[server主机名]>

有什么帮助/想法吗?

(最后一行是我添加的-之前它也没有起作用)

2个回答

2

太幸运了!在绝望地搜索Exim的用户邮件列表并准备发布问题之前,我偶然发现了答案。我打开的其中一条公告信息同时也发布到了exim-dev,并且在底部,存档查看器显示了该邮件列表中先前的消息,正是关于一个旧的已解决的DKIM错误“在dkim_sign_headers中包含的标题未包括在消息中时,不包括在签名中”。

但是,这启示我将不在我的Exim生成电子邮件中的标头从dkim_sign_headers中排除……它起作用了 :)

dkim = pass(签名已验证)

似乎DKIM签名应使用在“h”标签中指定的不存在的标头进行计算,以便如果随后将它们添加到电子邮件中,则签名将失败(具有某些安全性),因此我的猜测是微软公司在计算过程中出了问题,但我无法确定。


感谢分享 :) - Henry
你好!解决方案是在你的Exim配置文件中添加以下字符串:dkim_sign_headers = to:from:subject:message-id:date:user-agent:mime-version:content-transfer-encoding - NetVicious

1

根据 @lm713 的回答,我去了 exim 配置文件中工作。我所做的是:

  1. 查看头部,看看DKIM记录中发送了什么。在我的情况下是这个:

    来自服务器domain.com的用户通过本地(Exim 4.83) (信封来自 ) id xx-0000123-0K发送; Mon, 19 Mar 2018 21:04:41 +0100

  2. 通过SSH:进入exim.dkim.conf文件。您可以在此处找到它:/etc/exim.dkim.conf。如果您没有并且使用DirectAdmin,请按照此教程操作:https://help.directadmin.com/item.php?id=569

  3. 在以“dkim_sign_headers = ”开头的文件中添加一行额外的行。

  4. 查看您的标题DKIM记录并命名您看到的元素。在我的情况下是:

    来自服务器domain.com的用户通过本地(Exim 4.83) (信封来自 ) id xx-0000123-0K发送; Mon, 19 Mar 2018 21:04:41 +0100

所以我写道:dkim_sign_headers = from:user-agent:message-id:date

  1. 在此输入ssh:service exim restart。

现在应该可以正常工作了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接