在 bind9 中发布长域密钥记录

alx*_*omz 10 bind exim dkim

我正在建立一个基于 exim4 的邮件系统。该系统实现了 DKIM 签名和检查(除其他外)。签名似乎没有问题,但检查不起作用,exim4 抱怨我的 TXT 记录的语法,其中包含我的 dkim 公钥:

2014-02-02 22:37:31 1WA5fP-0004Y4-E2 DKIM: d=middle.earth s=a9d04665528b593d263a6e5256648c99 c=relaxed/relaxed a=rsa-sha256 [invalid - syntax error in public key record]
Run Code Online (Sandbox Code Playgroud)

我正在使用 2048 位长的 RSA 密钥在邮件中继级别对我的邮件进行签名(这可以正常工作,并且我确实在通过此服务器中继的邮件中有 DKIM 标头)。问题似乎在于绑定(我用于该区域的 DNS 服务器)不支持区域文件中长度超过 255 个字符的记录。所以我选择按照如下所示分割记录,并如非常值得信赖的网站 zytrax.com 中所述:

...
a9d04665528b593d263a6e5256648c99._domainkey IN  1800 TXT    ("k=rsa,p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz2/ZfhxSI/A"
                                         "bqgh0amM8ylrlosirWeKShUhq7fg12aYmRwOqq9hIzO0Fcz1BzfgHVu6HU++rC5"
                                         "QoUK0JQK/nk4jwkDgvG2di2ZYmAvEbY/VeiK1x/TG0p1Iczr2k6Bj0gEAb/YGD2"
                                         "YbwrwAi4bDXwoPsYuuNn9TB3jjyWKu/dvOsqhff1/4Wc+FkOi0ClvgrXiklN28X"
                                         "TLjyjSyU794ntIoegXxrfwcwkhfPMvuqcnhfIC0Z8L71M4WR4SoHyNHVfBtNlUv"
                                         "VNROiXlMxtxnNQvfViSwz6LC8bYIxeAba3hSXPTChKu3qZtfR0o3jFwEWAfLQdg"
                                         "Ixler0jMEoAyJmfQIDAQAB")
Run Code Online (Sandbox Code Playgroud)

完整的区域文件可以在这里找到:http : //pastebin.com/GDE5XA2M

使用该配置 exim 会抱怨上述错误。如果我尝试手动解析我的 dkim 记录,我会得到:

;; ANSWER SECTION:
a9d04665528b593d263a6e5256648c99._domainkey.middle.earth. 1800 IN TXT "k=rsa,p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz2/ZfhxSI/A" "bqgh0amM8ylrlosirWeKShUhq7fg12aYmRwOqq9hIzO0Fcz1BzfgHVu6HU++rC5" "QoUK0JQK/nk4jwkDgvG2di2ZYmAvEbY/VeiK1x/TG0p1Iczr2k6Bj0gEAb/YGD2" "YbwrwAi4bDXwoPsYuuNn9TB3jjyWKu/dvOsqhff1/4Wc+FkOi0ClvgrXiklN28X" "TLjyjSyU794ntIoegXxrfwcwkhfPMvuqcnhfIC0Z8L71M4WR4SoHyNHVfBtNlUv" "VNROiXlMxtxnNQvfViSwz6LC8bYIxeAba3hSXPTChKu3qZtfR0o3jFwEWAfLQdg" "Ixler0jMEoAyJmfQIDAQAB"
Run Code Online (Sandbox Code Playgroud)

这对我来说看起来不太正确,我可以想象 exim 会因为这样的输出而丢失。但是,我不能 100% 确定对于这么长的 DNS 记录是否是正常的 DNS 回复并且 exim 应该处理它,或者我坐起来绑定的方式是错误的。

对此的任何帮助将不胜感激。

谢谢。

Tod*_*ons 12

您在记录中使用逗号而不是分号来分隔键/值对。将其更改为:

a9d04665528b593d263a6e5256648c99._domainkey IN  1800 TXT (
         "k=rsa;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz2/ZfhxSI/A"
         "bqgh0amM8ylrlosirWeKShUhq7fg12aYmRwOqq9hIzO0Fcz1BzfgHVu6HU++rC5"
         "QoUK0JQK/nk4jwkDgvG2di2ZYmAvEbY/VeiK1x/TG0p1Iczr2k6Bj0gEAb/YGD2"
         "YbwrwAi4bDXwoPsYuuNn9TB3jjyWKu/dvOsqhff1/4Wc+FkOi0ClvgrXiklN28X"
         "TLjyjSyU794ntIoegXxrfwcwkhfPMvuqcnhfIC0Z8L71M4WR4SoHyNHVfBtNlUv"
         "VNROiXlMxtxnNQvfViSwz6LC8bYIxeAba3hSXPTChKu3qZtfR0o3jFwEWAfLQdg"
         "Ixler0jMEoAyJmfQIDAQAB")
Run Code Online (Sandbox Code Playgroud)

另外,我会注意到在我的特定区域文件中,我特别声明了版本v=DKIM1,我认为你也应该这样做。在一个侧面说明,我不换行记录( ),因为我只是做这一切作为一个长线:

record._domainkey IN 1800 TXT "v=DKIM1;blah" "blah2" "blah3"
Run Code Online (Sandbox Code Playgroud)

这是个人偏好,我现在意识到你的肯定更具可读性。

  • 我有 bind9,我注意到我不能在一个字符串中放置超过 255 个字符。但是将它拆分为多个字符串(在同一行),就像在您的示例中一样,每个字符串的长度小于 256 个字符,然后它就可以工作了。 (3认同)
  • 似乎它在 [RFC1035](https://tools.ietf.org/html/rfc1035) 第 3.3 节中指定:“<character-string> 是单个长度的八位字节,后跟该字符数。<character-string> 是被视为二进制信息,最长可达 256 个字符(包括长度八位字节)。” (3认同)