djbdns/tinydns 是否支持大TXT
记录,例如在提供长 DKIM 密钥时?
我知道 RFC 4408 第 3.1.3 节和 RFC 1035 第 3.3.14 节:
https://www.rfc-editor.org/rfc/rfc4408#section-3.1.3
https://www.rfc-editor.org/rfc/rfc1035#section-3.3.14
两者都表明TXT
可以将记录分成多个字符串,以允许提供长(> 255 个字符)记录。
我在研究过程中也遇到了这个问题:
https://serverfault.com/questions/255580/how-do-i-enter-a-strong-long-dkim-key-into-dns
我尝试了接受的答案中提到的两种方法,带和不带括号。
但是 djbdns 拒绝正确提供这些记录。例如,当我使用以下命令查询我的 domainkey 记录时,nslookup
我得到:
mail03._domainkey.zygonia.net text =
""v=DKIM1; k=rsa; p=" "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7UNgSlnndT9JY0soSjxLhFFnvAeVN8b6Y3oKctAunNltMjvXfTD37doER8a9xwEOIXkGPgxJ5UPb/KndvHiIo+j8AScoIZCW"
"glFWp4AUoKlQkKP7o7vwFnWypU+DmcJAtyuhZ9X5yzag37cVR"
"YD4icd02yAETLbIpv1mnMUFkTnkdmtSa5gL2cLUueUOValoENwkWTcZR" "+kraTEU/VDPI"
"RgNBu6OJmQdk0sv4qdkwVVvxvquT4C/SimQDoDaQwlFCp2sBryXyaNSRCaAhRxPaKUpKsPmubW0SJF2nQZ3DprJQcaRQLd9Qgxz+V+XaseaXXWPy+6"
"tB6BlPFk5FwIDAQAB""
*** Error: record size incorrect (515 != 419)
*** ns0.example.net can't find mail03._domainkey.zygonia.net: Unspecified error
其 DKIMTXT
记录如下:
"v=DKIM1; k=rsa; p=" "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7UNgSlnndT9JY0soSjxLhFFnvAeVN8b6Y3oKctAunNltMjvXfTD37doER8a9xwEOIXkGPgxJ5UPb/KndvHiIo+j8AScoIZCW1glFWp4AUoKlQkKP7o7vwFnWypU+DmcJAtyuhZ9X5yzag37cVRGYD4icd02yAETLbIpv1mnMUFkTnkdmtSa5gL2cLUueUOValoENwkWTcZR" "+kraTEU/VDPIrRgNBu6OJmQdk0sv4qdkwVVvxvquT4C/SimQDoDaQwlFCp2sBryXyaNSRCaAhRxPaKUpKsPmubW0SJF2nQZ3DprJQcaRQLd9Qgxz+V+XaseaXXWPy+6rtB6BlPFk5FwIDAQAB"
原始 djbdns 数据记录如下所示:
:mail03._domainkey.zygonia.net:16:\642"v=DKIM1;\040k=rsa;\040p="\040"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7UNgSlnndT9JY0soSjxLhFFnvAeVN8b6Y3oKctAunNltMjvXfTD37doER8a9xwEOIXkGPgxJ5UPb\057KndvHiIo+j8AScoIZCW1glFWp4AUoKlQkKP7o7vwFnWypU+DmcJAtyuhZ9X5yzag37cVRGYD4icd02yAETLbIpv1mnMUFkTnkdmtSa5gL2cLUueUOValoENwkWTcZR"\040"+kraTEU\057VDPIrRgNBu6OJmQdk0sv4qdkwVVvxvquT4C\057SimQDoDaQwlFCp2sBryXyaNSRCaAhRxPaKUpKsPmubW0SJF2nQZ3DprJQcaRQLd9Qgxz+V+XaseaXXWPy+6rtB6BlPFk5FwIDAQAB":600
当谈到长TXT
记录时,djbdns 就没有希望了吗?
答案1
关于 TXT 记录的一些背景知识以及它们如何用于 DKIM
TXT
记录是多值的,每个值都是一个字符串,最多可包含 255 个字节。
在您的示例中,您首先使用TXT
标准主文件格式指定的建议记录,该记录有三个值。
引号表示有三个值,请注意,这些值实际上不是记录数据的一部分,它们仅指定每个值的开始和结束位置。
您的TXT
价值:
"v=DKIM1; k=rsa; p=" "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7UNgSlnndT9JY0soSjxLhFFnvAeVN8b6Y3oKctAunNltMjvXfTD37doER8a9xwEOIXkGPgxJ5UPb/KndvHiIo+j8AScoIZCW1glFWp4AUoKlQkKP7o7vwFnWypU+DmcJAtyuhZ9X5yzag37cVRGYD4icd02yAETLbIpv1mnMUFkTnkdmtSa5gL2cLUueUOValoENwkWTcZR" "+kraTEU/VDPIrRgNBu6OJmQdk0sv4qdkwVVvxvquT4C/SimQDoDaQwlFCp2sBryXyaNSRCaAhRxPaKUpKsPmubW0SJF2nQZ3DprJQcaRQLd9Qgxz+V+XaseaXXWPy+6rtB6BlPFk5FwIDAQAB"
方法:
v=DKIM1; k=rsa; p=
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7UNgSlnndT9JY0soSjxLhFFnvAeVN8b6Y3oKctAunNltMjvXfTD37doER8a9xwEOIXkGPgxJ5UPb/KndvHiIo+j8AScoIZCW1glFWp4AUoKlQkKP7o7vwFnWypU+DmcJAtyuhZ9X5yzag37cVRGYD4icd02yAETLbIpv1mnMUFkTnkdmtSa5gL2cLUueUOValoENwkWTcZR
+kraTEU/VDPIrRgNBu6OJmQdk0sv4qdkwVVvxvquT4C/SimQDoDaQwlFCp2sBryXyaNSRCaAhRxPaKUpKsPmubW0SJF2nQZ3DprJQcaRQLd9Qgxz+V+XaseaXXWPy+6rtB6BlPFk5FwIDAQAB
对于 DKIM 而言,拥有多个值实际上没有意义,但由于记录的每个值的TXT
长度有限,并且 DKIM 规范认识到这一点,并规定,对于 DKIM 而言,多个值应该简单地连接成一个长字符串这允许使用长密钥。
即,DKIM 客户端会将上述值连接成字符串
v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7UNgSlnndT9JY0soSjxLhFFnvAeVN8b6Y3oKctAunNltMjvXfTD37doER8a9xwEOIXkGPgxJ5UPb/KndvHiIo+j8AScoIZCW1glFWp4AUoKlQkKP7o7vwFnWypU+DmcJAtyuhZ9X5yzag37cVRGYD4icd02yAETLbIpv1mnMUFkTnkdmtSa5gL2cLUueUOValoENwkWTcZR+kraTEU/VDPIrRgNBu6OJmQdk0sv4qdkwVVvxvquT4C/SimQDoDaQwlFCp2sBryXyaNSRCaAhRxPaKUpKsPmubW0SJF2nQZ3DprJQcaRQLd9Qgxz+V+XaseaXXWPy+6rtB6BlPFk5FwIDAQAB
这也意味着上述字符串可以在不同位置拆分而不会改变 DKIM 中的含义。
Tinydns 和 TXT
Tinydns 有两种方式可以用来表示记录TXT
(从https://cr.yp.to/djbdns/tinydns-data.html):
1)
'fqdn:s:ttl:timestamp:lo
fqdn 的 TXT(“文本”)记录。tinydns-data 为包含字符串 s 的 fqdn 创建 TXT 记录。您可以使用八进制 \nnn 代码在 s 内包含任意字节;例如,\072 是冒号。
2)
:fqdn:n:rdata:ttl:timestamp:lo
fqdn 的通用记录。tinydns-data 为显示 rdata 的 fqdn 创建类型为 n 的记录。n 必须是 1 到 65535 之间的整数;不能是 2 (NS)、5 (CNAME)、6 (SOA)、12 (PTR)、15 (MX) 或 252 (AXFR)。rdata 的正确格式取决于 n。您可以使用八进制 \nnn 代码在 rdata 中包含任意字节。
内置支持(上面的 1)似乎TXT
不允许明确指定多个值,但是,虽然手册没有说明这一点,但我发现有迹象表明它会自行拆分长字符串。
即,类似这样的操作应该可以工作(假设自动分割的信息实际上是正确的):
'mail03._domainkey.zygonia.net:v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7UNgSlnndT9JY0soSjxLhFFnvAeVN8b6Y3oKctAunNltMjvXfTD37doER8a9xwEOIXkGPgxJ5UPb/KndvHiIo+j8AScoIZCW1glFWp4AUoKlQkKP7o7vwFnWypU+DmcJAtyuhZ9X5yzag37cVRGYD4icd02yAETLbIpv1mnMUFkTnkdmtSa5gL2cLUueUOValoENwkWTcZR+kraTEU/VDPIrRgNBu6OJmQdk0sv4qdkwVVvxvquT4C/SimQDoDaQwlFCp2sBryXyaNSRCaAhRxPaKUpKsPmubW0SJF2nQZ3DprJQcaRQLd9Qgxz+V+XaseaXXWPy+6rtB6BlPFk5FwIDAQAB:7200
另一个选项,通用记录支持(上面的 2),只要你给它适当的数据。
问题是,数据引用有一个非常低级的表示,你绝对不能只是把一些纯文本放在那里并期望它能工作。
也就是说,如果你选择在 tinydns 中输入通用记录数据,那么主文件格式的记录表示(你通常使用的友好纯文本记录数据,例如建议给你的记录数据)对你没有帮助,但你宁愿查找如何将这些数据转换为 DNS 有线格式(DNS 协议中使用的实际二进制格式)并将其写入(必要时转义有问题的字节)数据场地。
即,对于一条TXT
记录,您将拥有以其长度为前缀的值字符串(单字节整数,需要以八进制进行转义,如文档中所述)。
djbdns/tinydns 是不是没戏了?
在我看来并不是因为它TXT
专门处理记录。
然而,这款软件的官方版本自 2001 年(1.05 版)以来就没有更新过。虽然
有补丁和分支可以解决各种缺陷(DNS 协议以及我们的需求和期望在过去 15 年中不断发展),但我认为切换到维护更好、更新的 DNS 服务器实现更有意义。