我无法理解启用 lets encrypt 时对子域名的 DNS 名称解析产生的特定影响。
我的问题背景:
我有一个域名(basjes.nl),并且我已将该域中的所有主机名设置为解析为同一个 IP 地址。
在我的 DNS 提供商(Transip)的 UI 中,我看到如下内容:
@ A x.x.x.x
* CNAME @
现在我可以这样做来获取指定的 IP 地址。
dig blurp.basjes.nl
最近我部署了ACME-DNS 工具并设置适当的 DNS 条目(即将 auth.basjes.nl 委托给我自己的 ACME-DNS 服务器)以允许 Lets Encrypt 通过 DNS 验证我拥有指定的主机名。
对于这个特定的主机名,我想要一个“全名”HTTPS 证书(即不是通配符),所以我添加了如下内容:
_acme-challenge.blurp CNAME something.auth.basjes.nl.
添加此条目后,我发现这样做dig blurp.basjes.nl
不再有效。奇怪的是,我没有收到错误(所以没有 NXDOMAIN),我要么什么都没有得到,要么只是
;; AUTHORITY SECTION:
basjes.nl. 300 IN SOA ns0.transip.net. hostmaster.transip.nl. 2018041107 14400 1800 2419200 300
所以现在我有这样的事情:
@ A x.x.x.x
* CNAME @
_acme-challenge.blurp CNAME something.auth.basjes.nl.
我发现如果我为该主机名添加一个明确的 DNS 记录,那么它突然又可以工作了:
@ A x.x.x.x
* CNAME @
blurp CNAME @
_acme-challenge.blurp CNAME something.auth.basjes.nl.
我想了解的效果:
为什么询问普通 DNS 服务器时它不再解析?
‘*’记录仍然存在!
dig blurp.basjes.nl @1.1.1.1
为什么直接询问 Transip 的 SOA DNS 服务器时它会解析?
dig blurp.basjes.nl @ns0.transip.net
为什么添加明确记录时它会解决?
这是我目前使用的一种解决方法,以使它能够为我工作。
PS:在发布此问题之前,我已经联系过 Transip 支持人员。他们不知道这里出了什么问题,也不知道为什么会发生这种情况。
答案1
DNS 是分层的。当你添加 name 时_acme-challenge.blurp.basjes.nl
,这意味着blurp.basjes.nl
也被隐式地添加了。这里可能令人惊讶的是名称可以存在而无任何内容。以前,当你dig
询问blurp.basjes.nl
时,你会得到一个完全正确和准确的答案:该名称存在,但不包含任何记录。这种情况,即名称的存在仅仅是因为 DNS 树中它下面有其他名称,称为空的非终结符。如果你想了解更多,可以谷歌一下该术语。
这是您令人困惑的行为的第一部分。第二部分是:当且仅当所要求的名称不存在时,通配符记录才用于生成答案。因此,首先您请求blurp.basjes.nl
并获得了由通配符生成的答案。然后您添加了_acme-challenge.blurp.basjes.nl
。当您之后再次询问时,该名称blurp.basjes.nl
确实存在(如上所述),因此未使用通配符。但由于blurp.basjes.nl
其中没有记录,您得到的只是一个空的响应。之后您添加了一条CNAME
记录blurp.basjes.nl
,所以当您再次询问时,这就是您得到的返回结果。
这样事情就清楚了吗?