有效的 DKIM 签名随机无法验证

Sol*_*rac 3 domain-name-system dkim opendkim

场景:

我有几台电子邮件服务器在防火墙后面的 Debian 上运行,有一个公共 IP,并且我已经正确设置了我的 DNS 记录(MCX、DMARC、DKIM、SPF)。

这是我的 DNS 记录示例(由 dig 命令输出):

DKIM
customselector._domainkey.domain.com. 3600 IN TXT  "v=DKIM1\; h=rsa-sha256\; k=rsa\; s=email\; " "p=MII...

SPF:
domain.com.           3599    IN      TXT     "v=spf1 mx -all"

MX:
domain.com.           3599    IN      MX      1 mailsystem.domain.com.

DMARC:
_dmarc.domain.com.    3599    IN      TXT     "v=DMARC1\;p=quarantine\;sp=reject\;rua=mailto:dmarc@domain.com\; ruf=mailto:dmarc@domain.com\; fo=1\; adkim=r\; aspf=r\; pct=100\; rf=afrf\; ri=86400"
Run Code Online (Sandbox Code Playgroud)

尝试了几个公共测试系统,我的整个设置得到了 100% 的验证。但是后来我开始收到这些奇怪的报告,显示有很多来自我的公共 IP 的不良电子邮件以及一些电子邮件得到了相同域的完美验证。下一个片段来自谷歌报告:

<record>
    <row>
      <source_ip>0.0.0.0</source_ip>
      <count>6</count>
      <policy_evaluated>
        <disposition>none</disposition>
        <dkim>pass</dkim>
        <spf>pass</spf>
      </policy_evaluated>
    </row>
    <identifiers>
      <header_from>domain.com</header_from>
    </identifiers>
    <auth_results>
      <dkim>
        <domain>domain.com</domain>
        <result>pass</result>
        <selector>customselector</selector>
      </dkim>
      <spf>
        <domain>domain.com</domain>
        <result>pass</result>
      </spf>
    </auth_results>
  </record>
  <record>
    <row>
      <source_ip>0.0.0.0</source_ip>
      <count>16</count>
      <policy_evaluated>
        <disposition>none</disposition>
        <dkim>fail</dkim>
        <spf>pass</spf>
      </policy_evaluated>
    </row>
    <identifiers>
      <header_from>domain.com</header_from>
    </identifiers>
    <auth_results>
      <dkim>
        <domain>domain.com</domain>
        <result>fail</result>
        <selector>customselector</selector>
      </dkim>
      <spf>
        <domain>domain.com</domain>
        <result>pass</result>
      </spf>
    </auth_results>
  </record>
  <record>
Run Code Online (Sandbox Code Playgroud)

我收到了 6 封好邮件 VS 16 封坏邮件,它们几乎都具有相同的内容。

测试:

  • check-auth@verifier.port25.com -> 好的
  • Gmail 邮件头 -> dkim=pass header.i=@domain.com;
  • www.mail-tester.com -> DKIM_VALID
  • autorespond+dkim@dk.elandsys.com -> DKIM 签名验证:通过
  • 在几个 DNS 服务器上挖掘 -> 好的
  • mxtoolbox.com -> 一切正常
  • 不同域上的邮件标头 -> 好的

配置:

我正在使用 opendkim,这是我认为相关的:

Canonicalization    relaxed/relaxed
Mode            sv
SubDomains      yes
Run Code Online (Sandbox Code Playgroud)

Sol*_*rac 5

虽然我的 DKIM 记录是“有效的”,但一些验证器不会接受h=rsa-sha256;DNS 记录中的参数,并且会将 DKIM 签名呈现为无效。我想象谷歌在他们的邮件服务器中使用了一些不同的 linux 发行版和不同的验证器。

要解决此问题,只需删除 DKIM 记录上的该参数,它应如下所示:

v=DKIM1; k=rsa; s=email; p=MI...
Run Code Online (Sandbox Code Playgroud)

在此之后,每封电子邮件都将得到正确验证。

我在做一些研究时浏览了http://dkimvalidator.com,它是唯一产生相当混乱信息的工具:

result = invalid
Details: public key: does not support hash algorithm 'sha256'
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,这个错误似乎不寻常,但是当您使用 opendkim 生成密钥时,您可能会发现自己在做这样的事情:

opendkim-genkey -b 2048 -h rsa-sha256 -r -s customselector -d domain.com -v
Run Code Online (Sandbox Code Playgroud)

将错误的参数写入txt输出文件,导致 DKIM 记录无效。