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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章