用let’s encrypt給域名添加免費的https
證書已經(jīng)不是什么新鮮事勋篓,但其不久前才開始支持泛域名吧享。我用的域名是在阿里云申請的,用第三方工具lego自動化為泛域名生成證書的時候遇到了SERVFAIL的錯誤譬嚣,這里記錄一下解決方案钢颂。
關(guān)鍵詞
let's encrypt,https拜银,dns-01殊鞭,SERVFAIL,lego尼桶,七牛操灿,萬網(wǎng),阿里云泵督,泛域名
TL;DR
解決方案:在運行lego
命令的時候趾盐,(可以通過修改/etc/resolv.conf
)暫時把DNS
設(shè)置為萬網(wǎng)或者阿里云的,例如ns1.alidns.com
(阿里云)小腊,dns19.hichina.com
(萬網(wǎng))救鲤,再運行命令即可。
細(xì)節(jié)
啥叫泛域名秩冈?簡單理解就是形如*.yourdomain.com這樣的本缠。這些域名對應(yīng)的(可能)不是一個ip地址,沒辦法用默認(rèn)的方法做認(rèn)證漩仙。
即使不用泛域名搓茬,在為七牛的存儲空間綁定域名的時候,自己只能設(shè)置一個CNAME
队他,讓自己的域名指向七牛的某一個域名卷仑,例如(形象地表示為)
CNAME img.yourdomain.com img.yourdomain.com.www.qiniudns.com
img.yourdomain.com
是自己可控的域名,可是指向的地址(在七牛)并不可控麸折, 同樣沒辦法用默認(rèn)的方式通過let's encrypt
的認(rèn)證锡凝。
這兩種情況下,都需要dns-01
這種認(rèn)證方式垢啼。簡單而直觀的解釋就是窜锯,認(rèn)證過程中需要設(shè)置一個帶特定值的TXT類型域名記錄张肾,以此證明域名的控制權(quán),從而生成證書锚扎。
網(wǎng)上教程很多吞瞪,大都使用了let's encrypt
的certbot
,需要手動去設(shè)置這個TXT記錄驾孔。請自行搜索方案芍秆,這里不贅述。我用的是lego
翠勉,可以自動生成TXT記錄妖啥,原理就是它通過調(diào)用域名服務(wù)商的api自動創(chuàng)建這個記錄,所以只需一條命令即可搞定对碌,形如:
ALICLOUD_ACCESS_KEY=xxxxxxxx ALICLOUD_SECRET_KEY=yyyyyyy lego --email="your@email.com" --domains="test.yourdomain.com" --dns="alidns" --accept-tos run
此時荆虱,可能會報錯SERVFAIL(大概是因為我的域名在萬網(wǎng)?具體原因我沒有整太明白):
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里面介紹的方法!