acme.sh 能够实现自动化续期,核心在于它完美实现了 ACME 协议(Automated Certificate Management Environment,自动化证书管理环境),并结合了操作系统的定时任务。
我们可以将其原理拆解为以下四个关键环节:
1. 核心协议:ACME 的“挑战-响应”机制
ACME 协议(主要是 RFC 8555 标准)规定了客户端(acme.sh)如何向证书颁发机构(CA,如 Let's Encrypt)证明你对域名的控制权。只有证明了域名是你的,CA 才会颁发证书。
acme.sh 主要支持两种“挑战(Challenge)”方式:
-
HTTP 挑战 (http-01):
- CA 给
acme.sh发送一个随机令牌(Token)。 acme.sh将这个令牌写到你网站根目录下的特定位置:.well-known/acme-challenge/随机文件名。- CA 通过互联网访问
http://你的域名/.well-known/acme-challenge/随机文件名。 - 如果 CA 读取到的内容正确,证明你确实有该服务器的控制权,验证通过。
- CA 给
-
DNS 挑战 (dns-01):
- CA 要求你在域名的 DNS 解析中添加一条特定的
TXT记录(主机记录通常为_acme-challenge)。 acme.sh通过调用域名商(如阿里云、Cloudflare、腾讯云)的 API 接口,自动帮你填入这个 TXT 记录。- CA 查询 DNS,如果记录匹配,证明你拥有该域名的管理权。
- 优势: 这种方式可以申请泛域名证书(*.example.com),且不需要公网 IP。
- CA 要求你在域名的 DNS 解析中添加一条特定的
2. 自动化触发:Cron Job(定时任务)
这是“自动续期”的动力源泉。
当你安装 acme.sh 时,它会自动在你的系统中添加一个 Cron 任务(Linux 下输入 crontab -l 就能看到)。
- 这个任务通常每天凌晨执行一次。
- 它会检查本地所有已安装证书的剩余有效期。
- 续期策略: 默认情况下,如果证书有效期少于 30 天,
acme.sh就会自动发起续期请求;如果还早,它就直接跳过。这样可以确保证书永远不会过期。
3. 证书获取与分发
一旦 CA 验证通过,acme.sh 会在本地生成 CSR(证书签名请求),利用私钥对请求进行签名,并发送给 CA。CA 随后返回签发好的证书文件(.cer / .crt)。
4. 关键动作:Reload(重载服务)
仅仅下载了新证书是不够的,因为 Nginx 或 Apache 等 Web 服务器只有在启动或重载时才会读取证书文件。
acme.sh 提供了一个关键参数 --reloadcmd。在续期成功后,它会自动执行你指定的命令,例如:
service nginx force-reload 或 docker restart my_nginx。
这样,Web 服务器就会加载新的证书,整个闭环才算真正完成。
总结:为什么 acme.sh 被称为神器?
- 零依赖: 它是纯 Shell 脚本编写的,不需要安装 Python、Go 等运行环境,兼容性极强。
- API 支持丰富: 支持全球上百家域名服务商的 API,让 DNS 验证变得极其简单。
- 静默运行: 一次配置成功后,它就在后台默默工作,用户几乎感知不到它的存在。
- 多 CA 支持: 虽然默认可能是 ZeroSSL 或 Let's Encrypt,但它支持切换多家兼容 ACME 协议的 CA。
一句话原理:
通过 Cron 定时任务 每天检查状态,利用 API 或文件写入 自动完成 ACME 权属验证,并在拿到新证书后自动 重启 Web 服务。