如何使用acme.sh自动续签证书

随着 Google 推进90天证书步伐的加快,业内纷纷针对 “SSL证书有效期缩短至90天” 提出倡议,TrustAsia开始响应此倡议,因此基于TrustAsia提供免费证书的云服务商提供的免费证书有效期也逐步从1年缩短为90天。

iShot_2024-07-17_13.17.18.png
iShot_2024-07-17_13.21.34.png
90天的有效期,确实比较短,再加上如果你有不止一个域名证书需要维护,那么维护工作的确会变得棘手。另外,有可能还会忘记续签,总不至于设置闹钟来提醒吧。因此,我也开始加入到证书部署自动化中来了😊。

今天,我使用acme.sh开源脚本工具,基于Let's Encrypt提供商,实现了证书自动续期。简单记录一下过程:

安装acme.sh

curl https://get.acme.sh | sh -s email=my@example.com

在Github上有详细的教程,这里就不赘述了。

配置环境变量

由于续签证书需要验证域名所有权,因此,需要对域名进行验证,例如常见的DNS解析验证。

因此,需要设置域名注册商的api访问权限以备acme脚本可以自动调用。我的两个域名先后注册在阿里云和腾讯云上,所以需要设置这两个供应商的api访问密钥。
首先需要创建一个子账户(为了账号安全,强烈建议使用子账户),然后对该子账户开放DNS解析控制权限。之后将对应的key和secret配置到环境变量文件~/.acme.sh/acme.sh.env中。

  • 阿里云
export Ali_Key="xxx"
export Ali_Secret="xxx"
  • 腾讯云
export Tencent_SecretId="xxx"
export Tencent_SecretKey="xxx"

设置acme.sh默认的证书服务商

我这里设置的是 letsencrypt

acme.sh --set-default-ca --server letsencrypt

执行证书颁发命令

我这里设置的是通配符证书

# 阿里云
acme.sh --issue --dns dns_ali -d *.keepchen.com -w /workspace/nginx/ssl_files/acme

# 腾讯云
acme.sh --issue --dns dns_tencent -d *.xxx.com -w /workspace/nginx/ssl_files/acme

命令执行之后,证书文件会被保存到指定目录下:

/home/<账号名>/.acme.sh/*.keepchen.com_ecc

修改代理服务器配置

我这里是nginx

ssl_certificate /home/<账号名>/.acme.sh/*.keepchen.com_ecc/fullchain.cer;
ssl_certificate_key /home/<账号名>/.acme.sh/*.keepchen.com_ecc/*.keepchen.com.key;

校验配置和证书是否正确:

sudo nginx -t

重启nginx让证书生效:

sudo service nginx restart  
# 也可以使用平滑重启:  
sudo nginx -s reload

从浏览器查看证书:
iShot_2024-07-17_13.47.18.png

设置计划任务自动续签

我这里使用Linux Crontab

将上面用到的命令统一编写到一个shell脚本中,然后配置crontab:

# 每月1号晚上23:30执行
30 23 1 * * sh /workspace/nginx/acme-shell/auto-renew-ssl.sh >> /dev/null

收工