用let’s encrypt给域名添加免费的https
证书已经不是什么新鲜事,但其不久前才开始支持泛域名。我用的域名是在阿里云申请的,用第三方工具lego自动化为泛域名生成证书的时候遇到了SERVFAIL的错误,这里记录一下解决方案。
关键词
let's encrypt,https,dns-01,SERVFAIL,lego,七牛,万网,阿里云,泛域名
TL;DR
解决方案:在运行lego
命令的时候,(可以通过修改/etc/resolv.conf
)暂时把DNS
设置为万网或者阿里云的,例如ns1.alidns.com
(阿里云),dns19.hichina.com
(万网),再运行命令即可。
细节
啥叫泛域名?简单理解就是形如*.yourdomain.com这样的。这些域名对应的(可能)不是一个ip地址,没办法用默认的方法做认证。
即使不用泛域名,在为七牛的存储空间绑定域名的时候,自己只能设置一个CNAME
,让自己的域名指向七牛的某一个域名,例如(形象地表示为)
CNAME img.yourdomain.com img.yourdomain.com.www.qiniudns.com
img.yourdomain.com
是自己可控的域名,可是指向的地址(在七牛)并不可控, 同样没办法用默认的方式通过let's encrypt
的认证。
这两种情况下,都需要dns-01
这种认证方式。简单而直观的解释就是,认证过程中需要设置一个带特定值的TXT类型域名记录,以此证明域名的控制权,从而生成证书。
网上教程很多,大都使用了let's encrypt
的certbot
,需要手动去设置这个TXT记录。请自行搜索方案,这里不赘述。我用的是lego
,可以自动生成TXT记录,原理就是它通过调用域名服务商的api自动创建这个记录,所以只需一条命令即可搞定,形如:
ALICLOUD_ACCESS_KEY=xxxxxxxx ALICLOUD_SECRET_KEY=yyyyyyy lego --email="your@email.com" --domains="test.yourdomain.com" --dns="alidns" --accept-tos run
此时,可能会报错SERVFAIL(大概是因为我的域名在万网?具体原因我没有整太明白):
2018/10/21 23:16:29 [INFO] [test.yourdomain.com] acme: Preparing to solve DNS-01
2018/10/21 23:16:33 Could not obtain certificates
acme: Error -> One or more domains had a problem:
[test.yourdomain.com] error presenting token: alicloud: unexpected response code 'SERVFAIL' for test.yourdomain.com.
再探究下来,是因为域名的SOA记录没有正确查询到,如果你也遇到这个问题,试试这个命令,看有没有SERVFAIL错误:
dig -t soa test.yourdomain.com
如果有的话,解决办法就是本文上面TL;DR里面介绍的方法!