比唸詩還簡單 —— Let's Encrypt 泛域名證書申請體驗
今天 Let’s Encrypt 官方也宣佈正式對 ACMEv2 和泛域名證書提供支持,想必經常折騰 SSL 證書的同學對於 Let’s Encrypt 這個致力於免費、開放以及自動化的證書頒發機構應該是很熟悉的。
之前 Let’s Encrypt 提供的證書是單域名的,因此新的子域名需要申請簽發新的證書。而我一些域名下依附的 API 較多,每次改動子域名都是一套麻煩的操作,簽發後再維護一大堆碎片化的證書實在是很讓人頭疼。
這次趁着機會,我來申請一個泛域名證書,這樣今後也會方便許多。順便我也會記錄下申請的過程,方便需要的同學參考。
正如標題所說的一樣,這個簡單的教程不含自動續期(renew)部分,如需要自動續期可以參考一些使用 Certbot 的用例。
找個客戶端#
首先,按照官方所述,我們需要一個支持 ACMEv2 的客戶端,這裏我們就選用 acme.sh。
按照 README 中的指導,我們只需要在終端中執行:
curl https://get.acme.sh | sh即可完成安裝。此時新建終端會話或是手動 acme.sh=~/.acme.sh/acme.sh 之後,執行 acme.sh 應該就可以看到輸出的幫助信息了。
驗證域名#
這個最簡單的道理就不用多說了吧,這裏我們選用 DNS TXT 記錄驗證域名所有權。爲了方便我準備直接手動修改 DNS 記錄,不使用各提供商的 Token。
以我要申請證書的域名 bitcat.cc 爲例:
acme.sh --issue -d "bitcat.cc" -d "*.bitcat.cc" --dns需要同時添加裸域名及泛域名。注意要將非泛域名的域名放在前面,否則可能會遇到一些問題。
接下來終端可能會吐出如下內容:
Multi domain='DNS:bitcat.cc,DNS:*.bitcat.cc'
Getting domain auth token for each domain
Getting webroot for domain='bitcat.cc'
Getting webroot for domain='*.bitcat.cc'
Add the following TXT record:
Domain: '_acme-challenge.bitcat.cc'
TXT value: '<ACME_CHALLENGE_STRING>'
Please be aware that you prepend _acme-challenge. before your domain
so the resulting subdomain will be: _acme-challenge.bitcat.cc
Please add the TXT records to the domains, and retry again.
Please add '--debug' or '--log' to check more details.
See: https://github.com/Neilpang/acme.sh/wiki/How-to-debug-acme.sh記錄下其中的 <ACME_CHALLENGE_STRING> 並前往你的 DNS 服務提供商,爲主機名 _acme-challenge 添加一條 TXT 記錄,內容即爲上述的 <ACME_CHALLENGE_STRING>。提交後可以等待一小段時間以便讓 DNS 生效。
也可以使用 dig _acme-challenge.bitcat.cc TXT 自查一下記錄是否存在。
申請簽發證書#
由於上一步驟中我們已經嘗試過申請證書籤發,只是沒有驗證域名所有權,纔去完成驗證所有權這一步驟。
因此這裏我們需要使用:
acme.sh --renew -d "bitcat.cc" -d "*.bitcat.cc" --dns來完成「續期」(現在的這種情況也等於申請簽發)操作。
然後你的終端可能會吐出以下內容:
Renew: 'bitcat.cc'
Multi domain='DNS:bitcat.cc,DNS:*.bitcat.cc'
Getting domain auth token for each domain
Verifying:bitcat.cc
Success
*.bitcat.cc is already verified, skip dns-01.
Verify finished, start to sign.
Cert success.
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
Your cert is in /Users/makito/.acme.sh/bitcat.cc/bitcat.cc.cer
Your cert key is in /Users/makito/.acme.sh/bitcat.cc/bitcat.cc.key
The intermediate CA cert is in /Users/makito/.acme.sh/bitcat.cc/ca.cer
And the full chain certs is there: /Users/makito/.acme.sh/bitcat.cc/fullchain.cer
It seems that you are using dns manual mode. please take care: The dns manual mode can not renew automatically, you must issue it again manually. You'd better use the other modes instead.
Call hook error.至此證書籤發完成,根據輸出信息的提示,你也可以在其中出現的路徑下找到證書以及祕鑰文件。
不過我們也能注意到最後兩行的提示信息提示我們正在使用手動模式:
It seems that you are using dns manual mode. please take care: The dns manual mode can not renew automatically, you must issue it again manually. You'd better use the other modes instead.
Call hook error.那麼,如何簡化申請流程呢?
使用 Token#
我們選用的 acme.sh 其實是支持直接使用主流 DNS 提供商的 API 接口來完成域名驗證以及一些相關操作的。
可參考這篇 README,其中包含了大部分主流 DNS 提供商的 Token 使用方法。
這裏咱選擇了 DNSPod,只需要在執行 acme.sh --issue ... 之前設定一下 Token 的相關變量即可:
export DP_Id="<ID>"
export DP_Key="<TOKEN>"DNSPod 的 Token 可在這裏進行申請和管理。
之後在執行 acme.sh 的時候要在 --dns 參數後加上 dns_dp 來指定 DNS 服務商(這裏對應的是 DNSPod)。
也就是說:
acme.sh --issue -d "bitcat.cc" -d "*.bitcat.cc" --dns dns_dp這樣就可以更方便的完成域名的所有權驗證以及進行證書申請簽發了。
後記#
經過服務器的一番配置,可以看到證書已經生效。

本次 Let’s Encrypt 提供了泛域名支持對於一直在尋找免費 SSL 證書的同學來說確實是一個大新聞,在 Let’s Encrypt 的努力之下,推廣 HTTPS 的網絡瀏覽體驗也將會變得相對更安全一些(與 HTTP 相比)。