`acme.sh` 能够实现自动化续期,核心在于它完美实现了 **ACME 协议

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):

    1. CA 给 acme.sh 发送一个随机令牌(Token)。
    2. acme.sh 将这个令牌写到你网站根目录下的特定位置:.well-known/acme-challenge/随机文件名
    3. CA 通过互联网访问 http://你的域名/.well-known/acme-challenge/随机文件名
    4. 如果 CA 读取到的内容正确,证明你确实有该服务器的控制权,验证通过。
  • DNS 挑战 (dns-01):

    1. CA 要求你在域名的 DNS 解析中添加一条特定的 TXT 记录(主机记录通常为 _acme-challenge)。
    2. acme.sh 通过调用域名商(如阿里云、Cloudflare、腾讯云)的 API 接口,自动帮你填入这个 TXT 记录。
    3. CA 查询 DNS,如果记录匹配,证明你拥有该域名的管理权。
    4. 优势: 这种方式可以申请泛域名证书(*.example.com),且不需要公网 IP。

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-reloaddocker restart my_nginx
这样,Web 服务器就会加载新的证书,整个闭环才算真正完成。


总结:为什么 acme.sh 被称为神器?

  1. 零依赖: 它是纯 Shell 脚本编写的,不需要安装 Python、Go 等运行环境,兼容性极强。
  2. API 支持丰富: 支持全球上百家域名服务商的 API,让 DNS 验证变得极其简单。
  3. 静默运行: 一次配置成功后,它就在后台默默工作,用户几乎感知不到它的存在。
  4. 多 CA 支持: 虽然默认可能是 ZeroSSL 或 Let's Encrypt,但它支持切换多家兼容 ACME 协议的 CA。

一句话原理:
通过 Cron 定时任务 每天检查状态,利用 API 或文件写入 自动完成 ACME 权属验证,并在拿到新证书后自动 重启 Web 服务