我们在主机提供商的 Web 界面上为 DKIM 密钥创建长 TXT 记录时遇到了问题。
每行只能接受256个字符。
我们尝试了多行,然后按照某些人的建议,尝试("
在第一行和")
最后一行之后添加。但都没有用。
然后我们尝试在另一个主机上创建一个 cname 记录,在那里我们能制作 DKIM TXT 记录。
但是现在网络界面抱怨CNAME
记录中的非法名称。
mail._domainkey.example.com TXT
可以
mail._domainkey.example.com CNAME
不行 可以
mail.domainkey.example.com CNAME
,但不是我们想要的。
难道网络界面就是要让我们抓狂,还是在 中使用下划线真的是“非法的” CNAME
?
答案1
主机名只能包含[0-9], [a-z], -
,因此下划线在主机名中无效。请注意,TXT 记录不是主机名,此限制不适用于它。(-
也不能用作第一个字符,因此mail.-domainkey.our.dom
无效。)
https://en.wikipedia.org/wiki/Hostname#Restrictions_on_valid_hostnames
当使用 CNAME 作为主机名时,上述限制适用。
但看起来 CNAME 在 DKIM 上下文中不被视为主机名,在这种情况下,_
应为 CNAME 条目的有效部分。 看SES 要求 CNAME 中有下划线,但注册商不允许 [关闭]
答案2
@Sven 的回答经过编辑已经是正确的了,但只是直接表述而已。
总结CNAME
是的,下划线在双方的记录中都有效,请阅读下文了解原因。
RFC 1034其他人则根据“域名”定义记录,域名是带有任何字符的标签,因此包括_
。
但某些记录对所有者名称和/或资源数据 (RDATA) 有更严格的规则。只有主机名会被接受,而且现在的规则确实如此(过去这些规则很宽松,主机名不能以数字开头),您可以使用任何 ASCII 字母(不区分大小写)、任何 ASCII 数字和连字符,再加上一些额外的位置规则:开头或结尾不能有连字符,位置 3 和 4 不能有双连字符(因为“保留”了xn--
只允许大小写的 IDN)。
例如,A
或AAAA
记录的所有者名称是主机名,而不是域名。因此,
test.example.com A 192.0.2.1
以下情况是合理的:
_test.example.com A 192.0.2.1
-test.example.com A 192.0.2.1
test-.example.com A 192.0.2.1
使用该程序测试东西很容易named-checkzone
(名称服务器软件的一部分bind
,但可以单独使用和安装,其他名称服务器可能有类似的检查工具,也可能有在线界面),只需将记录放入文件中并运行它:
$ cat z1.txt
test.example.com. 1 IN A 192.0.2.1
_test.example.com. 1 IN A 192.0.2.1
-test.example.com. 1 IN A 192.0.2.1
test-.example.com. 1 IN A 192.0.2.1
$ /usr/local/sbin/named-checkzone example.com z1.txt
z1.txt:2: _test.example.com: bad owner name (check-names)
z1.txt:3: -test.example.com: bad owner name (check-names)
z1.txt:4: test-.example.com: bad owner name (check-names)
(之前的数字IN
是 TTL,这与我们这里的问题无关,但只需要通过记录的语法验证)。
对于其他记录,情况则相反:对NS
所有者没有任何限制,但对“目标”即数据有限制。数据只能是主机名,而不能是域名,因为您需要指向权威名称服务器,即响应 DNS 查询的物理主机。
现在关于CNAME
,这里是 RFC 1034 第 3.6 节中的相关引述:
“所有者:即 RR 所在的域名。” 这意味着默认情况下是任何名称,而不仅仅是主机名(作为 CNAME 记录的来源)
“RDATA:是描述资源的类型,有时是类别相关数据:”
“CNAME 域名。”
因此,a 的所有者CNAME
(其左侧的内容)和附加到其上的资源数据、其目的地/目标(其右侧的内容)都是域名,而不仅仅是主机名。基本上任何字符都可以,因此两侧都_
允许包含。
再次,可以轻松测试named-checkzone
:
$ cat z2.txt
_foo 1 CNAME _bar
$ /usr/local/sbin/named-checkzone example.com z2.txt
zone example.com/IN: has 0 SOA records
zone example.com/IN: has no NS records
zone example.com/IN: not loaded due to errors.
没有任何错误CNAME
(其他错误是预料之中的,因为在我的虚假区域中我没有放置任何错误SOA
或NS
像真实区域那样的记录)
答案3
DNS 中允许使用任何有效字符。请参阅https://www.rfc-editor.org/rfc/rfc2181#section-11
“DNS 本身对可用于识别资源记录的特定标签只有一个限制。该限制与标签的长度和全名有关。任何一个标签的长度限制在 1 到 63 个八位字节之间。”
客户端必须验证名称值,例如,MX 记录可能包含值“Alice”,但查找后应拒绝该值,因为“Alice”不是有效的电子邮件地址。
在这种情况下,您的托管商似乎正在“验证”您的输入,并且他们应该能够为您手动输入。
答案4
RFC 1034:标签必须遵循 ARPANET 主机名的规则。它们必须以字母开头,以字母或数字结尾,并且内部字符只能是字母、数字和连字符。长度也有一些限制。标签必须不超过 63 个字符。