Exim 的 DKIM 签名不在 Microsoft 服务器(outlook、hotmail)上验证 *仅*

Exim's DKIM signatures do not verify on Microsoft servers (outlook, hotmail) *only*

Gmail 以及本地 ISP 通过 DKIM 获取 Exim 电子邮件,但 Microsoft 没有,失败记录在 header:

Authentication-Results: spf=pass (sender IP is [correct IP]) smtp.mailfrom=[correct domain].co.uk; outlook.com; dkim=fail (signature did not verify) header.d=[correct domain];outlook.com; dmarc=bestguesspass action=none header.from=[correct domain];

我尝试过的:

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

我注意到两件事:

  1. Google 在 "h" 标签中包含的 header 少得多,所以我重新配置 Exim 也正好使用这些,但无济于事。

  2. Google 在 "h" 标签中包含 lower-case 中的 header 名称,而 Exim 没有,即使我在 lower-case 在 Exim 的配置中。我读到在生成 header 签名哈希 时 header 名称应该是 lower-cased,但文本并未说明这同样适用于header "h" 标签中的名称(http://dkimcore.org/specification.html 第 3.2 节),但 Google 似乎是这样做的。我想在 Exim 中覆盖它会很困难?

我还注意到,除了 "h" 的差异外,DKIM-Signature header 结构在两者中完全相同,除了一些空白差异(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

(最后一行是我加的-之前也没用)

由于该错误似乎专门与签名验证有关,我认为以下内容无关紧要,但我还是将其包括在内:

服务器上的 nobody 先生正在发送 Exim 电子邮件,但是 envelope-from 和 Return-Path header 是预期发件人的正确电子邮件地址。这方面应该没有任何问题,因为即使在 MS 上,SPF 也通过了。

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

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

Exim 发送的邮件有

Message-ID: <[id]@[server host name]>

任何 help/ideas 将不胜感激。一如既往的 MS 使生活变得困难......有趣吗?

哇,太幸运了!我在发帖前绝望地搜索 Exim 的 user 邮件列表时偶然找到了答案。我打开的其中一条公告消息也发布到 exim-dev,因此在底部,存档查看器显示了此邮件列表中的上一条消息,恰好是关于一个旧的、已解决的 DKIM 错误 "Headers included in dkim_sign_headers are not in the signature when not in the message".

然而,这让我想到了排除 dkim_sign_headers 我的 Exim 生成的电子邮件中不存在的 headers... 它奏效了:)

dkim=pass (signature was verified)

似乎 DKIM 签名应该使用在 "h" 标签中指定的 non-existent headers 来计算,如果随后将它们添加到电子邮件中,签名将失败(具有一定的安全意义),所以我猜测是 MS 搞乱了计算,但我不确定。

根据@lm713 的回答,我开始在 exim 配置文件中工作。这就是我所做的:

  1. 查看 header 并查看随 DKIM 记录发送的内容。在我的例子中是这样的:

    来自 server.domain.com 的用户,本地 (Exim 4.83) (envelope-from ) id xx-0000123-0K; 2018 年 3 月 19 日星期一 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. 查看您的 header DKIM 记录并命名您看到的元素。在我的例子中是:

    来自 server.domain.com 的用户,本地 (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

  1. 在 ssh 中输入此命令后:service exim restart。

现在应该可以了。