前言
certbot-auto申請證書時發現如下提示;certbot-auto被棄用了
Skipping bootstrap because certbot-auto is deprecated on this system.
Your system is not supported by certbot-auto anymore.
Certbot cannot be installed.
Please visit https://certbot.eff.org/ to check for other alternatives.
根據github的issue看到作者的回應(原回復是英文, 我機翻了一下截圖出來)
github的issue: https://github.com/certbot/certbot/issues/8535

正文
安裝snap
centos7下的安裝如下:
# 將EPEL添加到CentOS 7
yum install epel-release
#安裝snapd
yum install snapd
#安裝后,需要啟用用於管理主快照通信套接字
systemctl enable --now snapd.socket
# 啟用快照支持
ln -s /var/lib/snapd/snap /snap
檢查更新snap版本
snap install core
snap refresh core
卸載舊的certbot
# 以前沒有裝過的不用這一步
yum remove certbot
安裝certbot
# 安裝certbot
snap install --classic certbot
# --classic: 官方對classic是如上面所描述的那樣定義的,它是與strict相對的。也就是說,在默認情況下,它使用的是strict模式,對安全權限做了極高的要求與限制,然后classic就和傳統的安裝包一樣對安全權限沒有限制,其實這里的classic就約等於確認已知不安全的風險的含義
# 添加軟鏈,全局使用
ln -s /snap/bin/certbot /usr/bin/certbot
申請泛域名證書和自動續期
申請前准備
不管是申請還是續期,只要是通配符證書,只能采用 dns-01 的方式校驗申請者的域名,也就是說 certbot 操作者必須手動添加 DNS TXT 記錄。
如果你編寫一個 Cron (比如 1 1 */1 * * root certbot-auto renew),自動 renew 通配符證書,此時 Cron 無法自動添加 TXT 記錄,這樣 renew 操作就會失敗,如何 解決?
certbot 提供了一個 hook,可以編寫一個 Shell 腳本,讓腳本調用 DNS 服務商的 API 接口,動態添加 TXT 記錄,這樣就無需人工干預了。
這里就要用到第三方插件: https://github.com/ywdblog/certbot-letencrypt-wildcardcertificates-alydns-au, 目前支持阿里雲 DNS、騰訊雲 DNS、華為雲 NDS、GoDaddy;
下載:
git clone https://github.com/ywdblog/certbot-letencrypt-wildcardcertificates-alydns-au
cd certbot-letencrypt-wildcardcertificates-alydns-au
chmod 0777 au.sh
申請證書
# 例子(這些參數根據自己的情況填寫)
certbot certonly
-d example.com
-d *.example.com
--manual
--preferred-challenges dns
--dry-run
--manual-auth-hook "/etc/certbot-letencrypt-wildcardcertificates-alydns-au/au.sh python aly add" # 申請之前添加TXT記錄
--manual-cleanup-hook "/etc/certbot-letencrypt-wildcardcertificates-alydns-au/au.sh python aly clean" # 申請之后刪除TXT記錄
--pre-hook "systemctl stop nginx.service" # 停止nginx
--post-hook "systemctl start nginx.service" # 啟動nginx
- -d: 域名
- --manual: 手動模式申請
- --preferred-challenges: 驗證方式
- --dry-run: 測試模式(正式使用時去掉這個參數)
- --manual-auth-hook: 以交互方式或使用shell腳本獲取證書鈎子
- --manual-cleanup-hook: 以交互方式或使用shell腳本獲取證書鈎子
- --pre-hook: 前置鈎子;可用來執行一些命令
- --post-hook: 后置鈎子;可用來執行一些命令
詳細的參數說明到github查看: https://github.com/ywdblog/certbot-letencrypt-wildcardcertificates-alydns-au
申請成功后:
配置文件: /etc/letsencrypt/renewal/
證書文件源目錄: /etc/letsencrypt/archive/
證書文件映射目錄: /etc/letsencrypt/live/
知道了這些,我們來實際操作一下:
nginx(openresty)配置文件中添加ssl證書, 這個不用多說了
首先去配置一下第三方插件, 檢查一下php和python執行程序的路徑是否正確, 並填寫阿里雲或者其他平台的key和token

- 然后執行生成命令:
certbot certonly \
-d ranblogs.com \
-d *.ranblogs.com \
--manual \
--preferred-challenges dns \
--manual-auth-hook "/disk2/soft_pack/certbot-letencrypt-wildcardcertificates-alydns-au/au.sh php aly add" \
--manual-cleanup-hook "/disk2/soft_pack/certbot-letencrypt-wildcardcertificates-alydns-au/au.sh php aly clean" \
--post-hook "cp -r /etc/letsencrypt/archive/ranblogs.com /disk2/nginx/cert/ranblogs.com && docker restart openresty"
# post-hook: 我這里是docker環境無法找到外面的文件, 所以我這里是把證書文件放到docker映射的目錄去了,並重啟openresty
執行結果:

驗證結果:


自動續期
上面已經成功申請到證書了, 但是只有三個月的有效期, 這肯定是不夠的, 還好certbot也提供了自動續期的命令certbot renew
現在我們把這個命令加到定時器:
crontab -e
# 定時續期(每天執行)
0 0 1 * * sudo certbot renew --deploy-hook "cp -r /etc/letsencrypt/archive/ranblogs.com /disk2/nginx/cert/ranblogs.com && docker restart openresty"
這里可能會有點疑問, 假如當天ssl到期了, 但是定時器還沒執行, 是不是會有一段時間內https無法使用; 其實certbot已經考慮到了, 會在到期前30天續期;所以不用擔心這個問題;
FAQ
報錯: /usr/bin/php: 沒有那個文件或目錄
自己修改路徑

參考資料
certbot官網: https://certbot.eff.org/
https://blog.csdn.net/baidu_19473529/article/details/114277125
https://github.com/ywdblog/certbot-letencrypt-wildcardcertificates-alydns-au
