80、443 埠無法使用時使用 Let’s Encrypt 簽發證書

Sneezry發表於2016-02-01

Let ’ s Encrypt 自從公測以來,就喚起了各路開發者的興趣,第三方自動化指令碼也是雨後春筍般出現。但是 Let ’ s Encrypt 與其它 CA 簽發證書時驗證域名所有權不太相同,它使用 ACME-server 進行域名驗證,原理就是驗證伺服器指定在客戶端伺服器的一個隨機的目錄下生成一個隨機的檔案,然後驗證是否能下載到這個檔案。

本來這是個很方便的驗證方法——更符合自動化的需求,但是,這也是 Let ’ s Encrypt 被抱怨的地方之一,很多情況下無法滿足這個驗證流程,比如我今天遇到的, 80 埠被完完全全 block 掉的情況。

於是後來,更多的人開始呼籲支援 DNS 方式驗證,最終 Let ’ s Encrypt 終於支援了 DNS 驗證域名所有權。

支援 DNS 驗證的第三方自動化工具也不少,letsencrypt.sh就是其中之一,下面我來向大家分享一下我使用 letsencrypt.sh 並且結合 DNSpod 的 API 實現自動化簽署 Let ’ s Encrypt 證書的過程,如果你使用其他的 DNS 服務,那麼在後面呼叫 hook 的地方,改為你所使用的 API 即可。

獲取 letsencrypt.sh

git clone https://github.com/lukas2511/letsencrypt.sh.git

進入 letsencrypt.sh 目錄

cd letsencrypt.sh

建立 domains.txt ,並把你要簽發的域名寫進去

nano domains.txt

下面是和 DNSpod 相關的,如果你使用的不是 DNSpod ,可以直接跳到編輯 hook.sh 。

在 DNSpod 中新增一條 TXT 記錄,主機名為_acme-challenge.<subname>。比如我要簽發 wiki.lizhe.org 這個域名的證書,那麼我就新增_acme-challenge.wiki 這個主機名。值隨便寫,後面簽發時程式會自動改。

獲取你的 DNSpod 域名 id 和記錄 id

curl -k https://dnsapi.cn/Domain.List -d "login_email=xxx&login_password=xxx"
curl -k https://dnsapi.cn/Record.List -d "login_email=xxx&login_password=xxx&domain_id=xxx"

複製 hook.sh.example 到 hook.sh

cp hook.sh.example hook.sh

編輯 hook.sh

nano hook.sh

找到deploy_challenge這個函式,$TOKEN_VALUE就是我們需要更改的 TXT 記錄值,對於 DNSpod ,通過我們前面找到的域名 id 和記錄 id 進行更新。

更新 DNS 記錄,將下面的內容寫在deploy_challenge函式中

curl -k https://dnsapi.cn/Record.Modify -d "login_email=xxx&login_password=xxx&domain_id=xxx&record_id=xxx&sub_domain=_acme-challenge.xxx&record_type=TXT&record_line=預設&value=${TOKEN_VALUE}"

記得把 xxx 都改成你自己的引數,注意sub_domain裡還有個 xxx ,sub_domain的字首我已經幫你加好了。

最後執行 letsencrypt.sh 簽發證書

./letsencrypt.sh -c -k ./hook.sh -t dns-01

如果一切順利,那麼在 certs 下面在各個以域名命名的資料夾下就會有證書檔案了,privkey.pem是私鑰,fullchain.pem是拼好的完整證書鏈,其他的檔案就不用管了。

如果不想把證書檔案放在當前路徑,在 hook.sh 的deploy_cert函式中,將生成的相應證書移動到目標目錄即可。

相關文章