【2023-02-04】阿里云这个插件作者不及时更新基本等于废了,推荐使用 --manual + hooks 的方式,具体看官方文档。

ssl证书如果用到很多个,手动更新将会比较烦,并且免费的 LetsEncrypt 90天就要更新一次,总不能今天更新完了,明天或下周又要更新,如果能让它自动更新岂不美哉?实践证明,这是行得通的。

首先,ssl证书我目前有2个用途,一个是自己服务器的nginx需要,nginx配置文件写好证书路径即可,每次获取到新的证书,nginx 需要重新加载配置文件,nginx -s reload。另一个用途是获取到证书之后上传给阿里云CDN使用,因为CDN开了https,上传证书通过CDN SDK的接口上传而不是手动。

使用 Certbot 申请证书,Certbot 第一步需要验证域名是不是属于你,验证方式有两种,http 和 dns。推荐使用 dns验证方式,虽然它稍复杂点,但是可以申请通配符证书,不需要占用80端口,而http方式就要加 --nginx 临时使用80端口,不用关闭重启nginx。重要的是,http验证的域名必须得指向本服务器,而dns不需要,所以可以通过dns直接申请证书给其他服务器使用。域名归属验证完之后,就可以申请证书。

dns方式需要一个dns插件,这个由域名服务商提供,阿里云的在这:

​GitHub - tengattack/certbot-dns-aliyun: A certbot dns plugin to obtain certificates using aliyun.​

注意,每次申请证书都是一次renewal,申请完之后会在 /etc/letencrypt/renewal 目录下生成配置文件为了renew续签,每次申请可以包含多个域名或子域名或通配符域名,如果有后续操作需要携带 --deploy-hook 参数,比如重新加载nginx 配置应用新证书,上传给CDN使用等等。申请完之后就可以用了。

申请证书运行命令如下:

certbot certonly -a certbot-dns-aliyun:dns-aliyun --certbot-dns-aliyun:dns-aliyun-credentials /etc/letsencrypt/credentials.ini -d *.randspace.xyz --deploy-hook "nginx -s reload"

最后需要配置自动续签,snap 本身包含了一个 renew timer,但是似乎不起作用,所以我把这个timer停止了,然后,只开 cron 定时任务,官方推荐执行 certbot renew 一天两次。定时任务如下,每天的0点和12点执行

0 0,12 * * * certbot renew

注意:certbot renew 会挨个处理所有 renewal,如果 renewal 创建的时候有 --deploy-hook参数,那么它会保存到 renewal 配置文件中,renew 时就不需要再次指定 hook 了。renew 如果没有到续签时间就会跳过。--deploy-hook 只有在真正获取到新的证书之后才会执行。