certbot-auto弃用后, 怎么继续用certbot申请泛域名证书
前言
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