关于HTTPS证书和CAA
HTTPS Certificate and CAA
上回说到用 Caddy 做 HTTP server + 反向代理,不用自己操心 HTTPS 证书比较省心,今天就遇到一个不省心的事情。
我除了 blog 这个 web app之外,还有一些其他小玩意挂在次级域名上,比如 wow.hegwin.me 是一个魔兽的战斗宠物工具,我把他添加到 Caddy的配置的时候,出现几行错误:
ERROR http.acme_client challenge failed {"identifier": "wow.hegwin.me", "challenge_type": "http-01", "problem": {"type": "urn:ietf:params:acme:error:dns", "title": "", "detail": "DNS problem: query timed out looking up CAA for wow.hegwin.me", "instance": "", "subproblems": []}}
ERROR http.acme_client validating authorization {"identifier": "wow.hegwin.me", "problem": {"type": "urn:ietf:params:acme:error:dns", "title": "", "detail": "DNS problem: query timed out looking up CAA for wow.hegwin.me", "instance": "", "subproblems": []}, "order": "https://acme-v02.api.letsencrypt.org/acme/order/893851047/155797659767", "attempt": 1, "max_attempts": 3}
注意其中的 “DNS problem: query timed out looking up CAA” 是错误的关键部分,我寻思着为什么顶级域名没事,次级域名就不可以,后来发现是我在国内的 DNS 解析的问题.
我在国内用的DNS服务器是 DNS.LA,顶级域名和次级域名都是作为 A 类型设置在这里,然后就很神奇的是 DNS.LA 只给主域名做了 CAA,可以用如下的 dig 命令可以CAA的情况(话说回来,域名解析和CAA可以是两件分开的事情)。
dig @dns.server domain.com caa
dig @dns.server sub domain.com caa
如果没有CAA记录,会有一个Timeout的返回:
; (1 server found)
;; global options: +cmd
;; connection timed out; no servers could be reached
因为次级域名的CAA查询失败,所以 Caddy 没法利用 acme 去搞得 HTTPS 证书。
我的解决方式是…既然顶级域名没事那先不管,次级域名的问题,只能回到 GoDaddy 里去配置解析从而解决CAA缺失问题,主要是考虑了这几个方面:
- Godaddy 的域名解析会明显导致国内的访问变慢,最好在国内不用它,但对于实验项目来说是可以接受的
- 国内的DNS解析供应商,如果要分别设置国内和海外的域名解析,价格都比较高
- HTTPS证书三个月一续,每次都手工切到 GoDaddy 续完再切回来太麻烦
CAA是什么?
CAA = Certification Authority Authorization,主要是限制为任意域名颁发证书,防止钓鱼。比如有人给不属于自己的网站域名颁发HTTPS证书,那显然是非法的,而域名主人此时应该收到通知。