主域名和子域名在不同账号的Route 53托管区域时,如何创建并验证子域名的ACM证书

0

【以下的问题经过翻译处理】 我有两个账户,第一个账户购买了 company.com 的域名,并在该账户中创建了这个域名的托管区域。我希望在第二个账户中为子域名 test.company.com 请求ACM证书。

遇到的问题:在申请 ACM 证书之后,在使用前需要先进行验证,在第一个账户的托管区域中按要求创建对应的 CNAME 记录,并填入对应的 CNAME 值。但是这个子域名证书验证一直未通过。如果我在第二个账户请求与主域名company.com 的证书,证书验证很顺利。

我的疑问:如果主域名的托管区域在另一个账户中,怎么样才能创建子域名的证书并通过验证?

我在一个帖子中找到了方案,根据https://repost.aws/questions/QUYsz79cxKSCGtCrf0WyylMg/route-53-zone-hosted-on-two-accounts 中的描述,我需要单独创建子域名的托管区域,获取生成的 NS 记录值。同时在主域名的托管区域中创建一条NS记录,将子域名的解析指向在上一步中获取的NS值。之后,才能在子域名的托管区域中,根据ACM证书的验证提示,来创建对应的子域名证书的 CNAME 记录。

这看上去比较复杂,需要配置的内容有点多。我希望能自动化的完成所有过程,涉及到 2 个不同的账户,创建多个托管区域以及管理所有这些的 CNAME 和 NS 记录。

profile picture
专家
已提问 6 个月前10 查看次数
1 回答
0

【以下的回答经过翻译处理】 您提及的这个方案是可行的。为了理解这个方案背后的原理,我们需要一些DNS相关的背景知识来帮助您更好理解。

DNS是一个分层分布式数据库系统。在层次结构的顶部是顶级域名(TLD, Top level domain)。我们以example.com为例进行说明(如RFC2606中所述)。

.com是example.com的顶级域名。当客户端(比如您的Web浏览器)想要打开example.com时,它需要知道将请求发送到哪个地址。所以首先会是查询根服务器(Root servers),找出哪些名称服务器负责example.com。您可以使用dig命令查看这一点。我们先查找.com顶级域名的SOA(授权起始)记录。

$ dig com
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 50969
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; QUESTION SECTION:
;com.				IN	A

;; AUTHORITY SECTION:
com.			900	IN	SOA	a.gtld-servers.net. nstld.verisign-grs.com. 1666967668 1800 900 604800 86400

上面的响应结果告诉我们a.gtld-servers.net是.com TLD的SOA授权起始。我们可以查询该主机,了解从哪台域名服务器可以查询example.com的信息。

$  dig @a.gtld-servers.net example.com

; <<>> DiG 9.10.6 <<>> @a.gtld-servers.net example.com
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 43068
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 2, ADDITIONAL: 1

;; QUESTION SECTION:
;example.com.			IN	A

;; AUTHORITY SECTION:
example.com.		172800	IN	NS	a.iana-servers.net.
example.com.		172800	IN	NS	b.iana-servers.net.

上述结果显示a.iana-servers.net是example.com的名称服务器。这意味着example.com被根名称服务器(层次结构的顶端)委托给a.iana-servers.net名称服务器(NS字段显示这是一个NS记录)。如果我们想知道在哪里找到example.com,我们需要直接询问该名称服务器。

$ dig @a.iana-servers.net example.com

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58415
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; QUESTION SECTION:
;example.com.			IN	A

;; ANSWER SECTION:
example.com.		86400	IN	A	93.184.216.34

现在我们得到了结果:example.com的IP地址是93.184.216.34。将名称指向IPv4地址的DNS记录被称为A记录。

如果example.com域名的所有者想要创建一个名为"test.example.com"的子域名,他们可以为这个子域名创建指向其他名称服务器的NS记录,来进一步委托。然后,您可以查询这些名称服务器,以找到test.example.com子域中主机的记录。

有了这个背景基础,我们现在可以看到它是如何与Route 53一起工作的。

假设您有两个账户:A账户和B账户。在A账户中,存在域名(example.com)。在B账户中,您想要配置子域名test.example.com。首先,您需要委托该域名。在B账户中,在Route 53中创建一个名为"test.example.com"的新托管区域。Route 53将自动为新的托管区域创建四个NS记录。之后,在A账户中委托该域名,创建一个新的NS记录。使用test.example.com作为名称,并输入Route 53给您的四个NS记录作为值。通过这种方式,您将test.example.com从A账户委托给B账户。

在成功委托了test.example.com后,您就可以在B账户中的Route 53中创建新的DNS记录了。您可以申请您的ACM证书,然后在Route 53中创建CNAME记录进行验证。因为test.example.com已经正确的委托了,ACM将能够查找到该CNAME记录,验证了您可以拥有该域名。验证完成后,ACM将颁发证书。

看起来有很多步骤,但我们可以使用CloudFormation或Terraform等工具实现整个过程的自动化。

如果您想深入了解DNS,建议您直接查阅RFC 1591。如果您倾向轻量化的阅读材料,AWS有一篇很好的关于这个主题的文章

profile picture
专家
已回答 6 个月前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则