天天看點

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

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.。比如我要簽發 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函數中,将生成的相應證書移動到目标目錄即可。

轉載自http://www.ituring.com.cn/article/211255