使用certbot 工具,為不能自動給letencrypt 通配符證書自動續期(renew)而煩惱嗎?這個工具能夠幫忙!
不管是申請還是續約,只要是通配符證書,只能採用dns-01 的方式校驗申請者的域名,也就是說certbot 操作者必須手動新增DNS TXT 記錄。
如果你寫一個Cron (例如1 1 */1 * * root certbot-auto renew),自動renew 通配符證書,此時Cron 無法自動新增TXT 記錄,這樣renew 操作就會失敗,如何解決?
certbot 提供了一個hook,可以編寫一個Shell 腳本,讓腳本調用DNS 服務商的API 接口,動態添加TXT 記錄,這樣就無需人工幹預了。
在certbot 官方提供的插件和hook 範例中,都沒有針對國內DNS 伺服器的範例,所以我編寫了這樣一個工具,目前支援阿里雲DNS 、騰訊雲DNS 、華為雲NDS 、 GoDaddy (certbot 官方沒有對應的插件)。
近期合併了幾個PR,沒有測試,有問題回饋給我,謝謝!
1:下載
$ git clone https://github.com/ywdblog/certbot-letencrypt-wildcardcertificates-alydns-au
$ cd certbot-letencrypt-wildcardcertificates-alydns-au
$ chmod 0777 au.sh
2:配置
(1)domain.ini
如果domain.ini檔案沒有你的根域名,請自行加入。
(2)DNS API 金鑰:
這個API 密鑰什麼意思呢?由於需要透過API 操作阿里雲DNS, 騰訊雲DNS 的記錄,所以需要去網域服務商哪裡取得API 金鑰,然後配置在au.sh 檔案中:
(3)選擇運行環境
目前該工具支援五種運行環境和場景,透過hook 檔案和參數來呼叫:
根據自己伺服器環境和網域服務商選擇任一個hook shell(包含對應參數),具體使用請見下方。
3:申請證書
測試是否有錯誤:
$ ./certbot-auto certonly -d *.example.com --manual --preferred-challenges dns --dry-run --manual-auth-hook "/脚本目录/au.sh php aly add" --manual-cleanup-hook "/脚本目录/au.sh php aly clean"
Debug:操作DNS API 可能會遇到一系列問題,例如API token 權限不足,遇到相關問題,可以查看/var/log/certd.log。
重要解釋: --manual-auth-hook 和--manual-cleanup-hook 有三個參數:
例如你要選擇Python環境,可以將--manual-auth-hook 輸入修改為"/腳本目錄/au.sh python aly add",--manual-cleanup-hook 輸入修改為"/腳本目錄/au.sh python aly clean"
確認無誤後,實際運作(移除--dry-run 參數):
# 实际申请
$ ./certbot-auto certonly -d *.example.com --manual --preferred-challenges dns --manual-auth-hook "/脚本目录/au.sh php aly add" --manual-cleanup-hook "/脚本目录/au.sh php aly clean"
參數解釋(可以不用關心):
如果你想為多個網域申請通配符憑證(合併在一張憑證中,也叫做SAN 通配符憑證),直接輸入多個-d 參數即可,例如:
$ ./certbot-auto certonly -d *.example.com -d *.example.org -d www.example.cn --manual --preferred-challenges dns --dry-run --manual-auth-hook "/脚本目录/au.sh php aly add" --manual-cleanup-hook "/脚本目录/au.sh php aly clean"
1:對機器上所有憑證renew
$ ./certbot-auto renew --manual --preferred-challenges dns --manual-auth-hook "/脚本目录/au.sh php aly add" --manual-cleanup-hook "/脚本目录/au.sh php aly clean"
2:某一張證書進行續期
先看看機器上有多少證書:
$ ./certbot-auto certificates
可以看到很多證書,如圖:
記住憑證名,例如simplehttps.com,然後執行下列命令renew:
$ ./certbot-auto renew --cert-name simplehttps.com --manual-auth-hook "/脚本目录/au.sh php aly add" --manual-cleanup-hook "/脚本目录/au.sh php aly clean"
編輯檔案/etc/crontab :
#证书有效期<30天才会renew,所以crontab可以配置为1天或1周
1 1 */1 * * root certbot-auto renew --manual --preferred-challenges dns --manual-auth-hook "/脚本目录/au.sh php aly add" --manual-cleanup-hook "/脚本目录/au.sh php aly clean"
如果是certbot 機器和執行web服務(例如nginx,apache)的機器是同一台,那麼成功renew憑證後,可以啟動對應的web 伺服器,執行下列crontab :
# 注意只有成功renew证书,才会重新启动nginx
1 1 */1 * * root certbot-auto renew --manual --preferred-challenges dns --deploy-hook "service nginx restart" --manual-auth-hook "/脚本目录/au.sh php aly add" --manual-cleanup-hook "/脚本目录/au.sh php aly clean"
注意:只有單機建議這樣運行,如果要將憑證同步到多台web伺服器,需要有別的方案,目前在開發中,主要目的就是同步憑證到叢集伺服器上
公眾號二維碼:
《深入淺出HTTPS:從原理到實戰》二維碼: