Exim的DKIM签名无法在Microsoft服务器(outlook,hotmail)上验证* * *

时间:2016-11-02 16:18:36

标签: email outlook hotmail dkim exim

Gmail和本地ISP通过DKIM发送Exim电子邮件,但微软没有通过标题中注明的失败:

  

身份验证 - 结果:spf = pass(发件人IP是[正确的IP])   smtp.mailfrom = [correct domain] .co.uk; outlook.com; dkim =失败(签名确实   不验证) header.d = [正确域名]; outlook.com;   dmarc = bestguesspass action = none header.from = [correct domain];

我尝试过:

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

我注意到两件事:

  1. Google在“h”标记中包含的标题少得多,因此我重新配置了Exim也正好使用这些标题,但无济于事。

  2. Google在“h”标记中包含小写的标题名称,而Exim没有,尽管我在Exim的配置中以小写形式输入了它们。我在生成标头签名哈希时读到了标题名称应该是低位的,但是文本没有说明同样适用于“h”标记中的标题名称(http://dkimcore.org/specification.html第3.2节),谷歌似乎也这样做了。我想在Exim中压倒这个会很难吗?

  3. 我还注意到除了“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先生发送,但信封来自和Return-Path标头是预期发件人的正确电子邮件地址。这个领域不应该有任何问题,因为即使在MS上,SPF也会通过。

    虽然Google发送的电子邮件已经

      

    消息ID:&lt; [id] @ [发件人域名]&gt;

    Exim发送的电子邮件

      

    消息ID:&lt; [id] @ [服务器主机名]&gt;

    非常感谢任何帮助/想法。一如既往MS让生活变得困难......有趣吗?

2 个答案:

答案 0 :(得分:2)

哇,这很幸运!在发布之前,我无可救药地搜索Exim的用户邮件列表时找到了答案。我打开的一条公告消息也发布到了exim-dev,因此在底部,归档查看器显示了此邮件列表中的上一条消息,该消息恰好是一个旧的,已解决的DKIM错误&#34;包括标题在dkim_sign_headers不在签名中时,不在消息&#34;。

但是,这让我有机会从dkim_sign_headers中排除我的Exim生成的电子邮件中没有的标题...并且它有效:)

  

dkim = pass(签名已经过验证)

似乎DKIM签名应该使用&#34; h&#34;中指定的不存在的标头来计算。如果签名随后被添加到电子邮件中,则会使签名失败(这具有一定的安全性),所以我的猜测是MS会弄乱计算,但我不确定。

答案 1 :(得分:0)

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

  1. 查看标题,查看使用DKIM记录发送的内容。就我而言,就是这样:

    来自user.domain.com的用户使用本地(Exim 4.83)(信封来自)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. 在文件中添加一个额外的行,以&#34; dkim_sign_headers =&#34;开头。

  4. 查看标题DKIM记录并命名您看到的元素。就我而言,它是:

    来自user.domain.com的用户使用本地(Exim 4.83)(信封来自)id xx-0000123-0K;星期一,2018年3月19日21:04:41 +0100

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

    1. 此类型在ssh:service exim restart。
    2. 之后

      现在应该可以了。