let’s encrypt,泛域名,SERVFAIL和阿里云

用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 encryptcertbot,需要手动去设置这个TXT记录。请自行搜索方案,这里不赘述。我用的是lego,可以自动生成TXT记录,原理就是它通过调用域名服务商的api自动创建这个记录,所以只需一条命令即可搞定,形如:


ALICLOUD_ACCESS_KEY=xxxxxxxx  ALICLOUD_SECRET_KEY=yyyyyyy lego --email="[email protected]" --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里面介绍的方法!

你可能感兴趣的:(let’s encrypt,泛域名,SERVFAIL和阿里云)