使用 acme 自动更新 SSL 证书

SSL(Secure Sockets Layer)证书是一种数字证书,用于在网络通信中提供安全加密。SSL 证书的主要功能是确保客户端和服务器之间的数据传输是加密的,从而防止数据在传输过程中被窃听、篡改或伪造。

Prologue

​ 又到了一年一度的 SSL 证书更新环节,本来打算继续手动申请的,反正一年更新一次也不会花太多时间。手动更新证书也正好是一个驱动我来顺带更新几篇文章的驱动。

​ 由于服务器当时购买的是腾讯云,所以域名解析也就一起用了他家的 DNSPod,但是等到我正准备手动申请证书的时候,突然发现:免费 SSL 证书只有 3 个月有效期了!! 相关公告

​ 天塌了呀有木有。T _ T,这下手动更新频率直接从一年一次变成到一年四次。

探索自动化解决方案

​ 本来打算看看有没有申请证书的 API,然后自己写一个 cron job 脚本每两个月跑一次,但是等我打开浏览器,直接发现了咱们今天的主角—— ACME

上手 ACME

​ 首先需要下载它的脚本:

$ curl https://get.acme.sh | sh -s email=<自己的邮箱>

​ 由于我使用的是腾讯家的 DNSPod,所以还需要在环境变量中导出自己的 SecretId 和 SecretKey

$ export Tencent_SecretId="<Your SecretId>"
$ export Tencent_SecretKey="<Your SecretKey>"

​ 接着就可以使用 acme 申请证书啦:

$ acme.sh --issue --dns dns_tencent -d ixjs.com -d *.ixjs.com

​ 在这里,我直接指定了域名解析商为 dns_tencent 。等到命令执行完,证书就已经被保存到 ~/.acme.sh/ixjs.com/ 目录下了。但是 ACME 官方不建议直接使用 ~/.acme.sh/ 目录下的证书:

DO NOT use the certs files in ~/.acme.sh/ folder, they are for internal use only, the folder structure may change in the future.

​ 取而代之的是需要使用 acme.sh 把证书安装到其他目录下面,于是:

$ acme.sh --install-cert -d ixjs.com \
  --key-file       /usr/local/nginx/https_certificate/key.pem \
  --fullchain-file /usr/local/nginx/https_certificate/cert.pem \
  --reloadcmd     "service nginx force-reload"

​ 由于我使用的是 Nginx,所以 --reloadcmd 用的是这个 service nginx force-reload ,你可能需要根据自己的情况修改 --reloadcmd 来重启服务。

​ 接下来,需要手动修改一下 Nginx 的配置:

server
    {
        listen 443 ssl http2;
        # listen [::]:80 default_server ipv6only=on;
        server_name ixjs.com;

        ssl_certificate /usr/local/nginx/https_certificate/cert.pem;
        ssl_certificate_key /usr/local/nginx/https_certificate/key.pem;
        # 省略其余配置 ...
    }

​ 最后,重启一下 Nginx:

$ systemctl reload nginx

​ 接下来,acme.sh 已经托管了证书的刷新工作,大功告成!

blog_acme_upgrade_ssl_2

Epilogue

​ 简单查看一下 acme.sh 任务:

$ crontab -l
53 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

后续更新 2024.07.30

​ 证书刷新了,符合预期。

blog_acme_upgrade_ssl_1

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部