昨天使用certbot续期证书,输入certbot renew,没出现预期的“Congratulations, all renewals succeeded.”,而是意外的“DNS problem: query timed out looking up CAA for tlanyan.pp.ua”。咦,怎么突然就出错了呢?

按照以往的经验,首先确认域名记录存在,并且443端口已经开启。于是登录到国内和国外的几台服务器,执行telnet tlanyan.pp.ua 443,无一例外的返回“Connection refused”,说明域名解析正常并且443端口做好了连接验证的准备。用dig命令查询域名解析,返回记录存在并且IP指向服务器。

上Google查原因和解决方案,发现不少人遇到同样的问题。在Let’s Encrypt的官方论坛和Server Fault,回帖基本上是针对个例的分析和解答,没看出问题原因和可行的解决方案。由于之前出现过域名校验失败导致certbot执行出错,过几小时再试就OK的例子,心想可能Let’s Encrypt服务器抽风了,明天也许就可以了。

今天登陆服务器执行命令,问题依旧,知道这次是真有问题。

要解决错误,首先要是弄清楚错误提示中的CAA是什么。CAA是证书颁发机构授权的缩写,域名的CAA记录用来指明能对域名签发证书的机构。该记录用来增强网站安全性,不是必须的。如果不存在,意味着所有的证书机构都可以给域名颁发证书。CAA记录的资源类型是type257,dig命令可以查看域名的CAA值,例如:dig tlanyan.pp.ua type257

明白了CAA和其作用,再回头看certbot的报错:CAA记录查询超时。没有CAA信息,Let’s Encrypt不能给域名颁发证书,所以程序直接就退出了。

为什么查询CAA记录超时呢?基本上断定是dns解析服务出了问题。本站域名用的dnspod解析,进入其管理面板,发现不能增加CAA记录。这是不是说明dnspod不支持CAA记录?

Google上搜索“dnspod caa”,发现有人吐槽dnspod导致Let’s Encrypt出现颁发证书报错的问题。这证实了之前的猜想,确实是dns解析服务出问题导致的。

问题解决办办法也很简单:换一家dns服务商。把域名解析换成cloudxns,certbot报错立马消失,证书顺利续签。

如果你使用dnspod,遇到了同样的问题,建议你换一家服务商,或者付费购买证书。

PS: 换掉dnspod后,无需添加CAA记录也能正常查询到CAA记录。网上分析是dnspod为了安全,把一些查询给屏蔽掉了,导致CAA记录的查询超时。

参考

  1. https://support.dnsimple.com/articles/caa-record/
  2. https://w4ng.com/nginx-use-letsencrypt-ssl-https/