随着 Google 推进90天证书步伐的加快,业内纷纷针对 “SSL证书有效期缩短至90天” 提出倡议,TrustAsia开始响应此倡议,因此基于TrustAsia提供免费证书的云服务商提供的免费证书有效期也逐步从1年缩短为90天。
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
从浏览器查看证书:
设置计划任务自动续签
我这里使用Linux Crontab
将上面用到的命令统一编写到一个shell脚本中,然后配置crontab:
# 每月1号晚上23:30执行
30 23 1 * * sh /workspace/nginx/acme-shell/auto-renew-ssl.sh >> /dev/null