使用 acme.sh 实现自动续签SSL证书
概述
本文记录了将网站 kaiwen.work 的 SSL/TLS 证书从“腾讯云控制台手动申请并上传”的模式,迁移到“使用 acme.sh 实现全自动申请、部署与续期”的完整操作流程。通过此方案,服务器证书将在到期前自动更新,无需人工干预,彻底解决证书过期导致的服务中断风险。
核心组件
- 自动化工具:https://github.com/acmesh-official/acme.sh - 一个纯 Shell 脚本实现的 ACME 协议客户端,支持 Let‘s Encrypt、ZeroSSL 等证书颁发机构(CA)。
- 验证方式:DNS API 验证(本文以腾讯云 DNSPod 为例)。
- 证书颁发机构:Let’s Encrypt(切换自 ZeroSSL 以避免限流)。
- Web 服务器:Nginx。
操作流程详解
第一阶段:环境准备与工具安装
安装 acme.sh
通过以下命令一键安装,安装过程会自动创建 cron 定时任务用于后续的自动续期检查。# 邮箱更换为个人邮箱 curl https://get.acme.sh | sh -s email=my@example.com安装后建议重载 Shell 配置或新开终端,使
acme.sh命令生效。配置 DNS API 凭证(关键)
为实现自动化的域名验证,需要配置腾讯云 DNSPod 的 API 密钥。此步骤只需执行一次。- 在腾讯云控制台【访问管理】>【API密钥管理】创建并获取
SecretId和SecretKey。 临时导出到当前 Shell 环境(安全推荐):
export Tencent_SecretId="你的SecretId" export Tencent_SecretKey="你的SecretKey"
- 在腾讯云控制台【访问管理】>【API密钥管理】创建并获取
第二阶段:申请证书
此步骤将触发 acme.sh 通过 ACME 协议向 CA 申请一张新证书。
(可选)切换默认 CA
如果遇到 ZeroSSL 的速率限制,可切换到对测试更友好的 Let‘s Encrypt:acme.sh --set-default-ca --server letsencrypt执行证书签发命令
使用 DNS API 模式为域名kaiwen.work及其子域名www.kaiwen.work申请证书。acme.sh --issue --dns dns_tencent -d kaiwen.work -d www.kaiwen.work--dns dns_tencent:指定使用腾讯云 DNS API 进行验证。- 命令执行成功后,证书文件会生成在
~/.acme.sh/kaiwen.work_ecc/目录下。
第三阶段:安装证书并配置 Nginx
使用 --install-cert 命令将其“安装”到持久化目录,并完成 Nginx 的集成。
执行安装命令
该命令是实现自动续期的核心,它会:- 将证书文件复制到指定目录。
- 在系统 Cron 中注册续期任务。
- 设置证书更新后自动执行的命令(如重载 Nginx)。
acme.sh --install-cert -d kaiwen.work \ --key-file /etc/nginx/ssl/kaiwen.work.key \ --fullchain-file /etc/nginx/ssl/kaiwen.work_bundle.crt \ --reloadcmd "systemctl reload nginx"确保 Nginx 配置指向正确路径
验证 Nginx 配置文件中的ssl_certificate和ssl_certificate_key指令是否指向了上一步安装命令中指定的路径。# 在 Nginx 的 server 块中确认 ssl_certificate /etc/nginx/ssl/kaiwen.work_bundle.crt; ssl_certificate_key /etc/nginx/ssl/kaiwen.work.key;测试并重载 Nginx
nginx -t && systemctl reload nginx
第四阶段:验证与后续维护
验证自动续期系统
- 检查 Cron 任务:执行
crontab -l | grep acme,确认存在类似0 0 * * * "/root/.acme.sh"/acme.sh --cron ...的定时任务。 - 测试续期流程:可运行
acme.sh --cron --dry-run进行模拟测试。 - 在线验证:浏览器访问
https://kaiwen.work,点击地址栏锁图标,确认颁发者为 Let's Encrypt 且有效期为 90 天。
- 检查 Cron 任务:执行
后续维护要点
- 无需操作:系统将在证书到期前约 30 天自动完成续期、部署和 Nginx 重载。
- 唯一依赖:确保腾讯云 API 密钥长期有效。若密钥变更,需重新设置
Tencent_SecretId和Tencent_SecretKey环境变量。 - 旧证书处理:之前手动申请的腾讯云证书文件在服务器上可安全删除,控制台内的记录可视情况保留或清理。
总结
通过以上四个阶段,我们成功构建了一个基于 acme.sh 的 SSL 证书自动化管理系统。该系统实现了:
✅ 零成本:使用 Let’s Encrypt 的免费证书。
✅ 全自动:证书申请、验证、续期、部署、服务重载全程无人值守。
✅ 高可靠:基于稳定的 ACME 协议和 Cron 定时任务。
✅ 易维护:配置一次,长期有效,彻底解放运维人力。