acme.sh 迎来重磅更新:彻底告别 API 密钥,DNS persist 模式详解

最近一直在折腾 SSL 证书,尤其是对于那些没有公网 IP 的机器,DNS 验证几乎是唯一的选择。但是,每次续期都要把 CloudFlare 或者阿里云的 API 密钥放在服务器上,心里总觉得不踏实,生怕哪天密钥泄露搞得 DNS 被污染。

DNS API 密钥配置界面示意图

传统模式下在 DNS 服务商后台配置 API 密钥的场景

就在前几天,acme.sh 官方悄无声息地推出了一项非常实用的新功能——DNS persist 模式。简单来说,只要你的 DNS TXT 记录保持不变,后续续期证书就完全不需要再调用 DNS 服务商的 API 了。这对我们这种既想自动化,又担心 Key 泄露的人来说,简直是福音。

今天就带大家深入扒一扒这个新功能到底怎么用,以及它到底能帮我们解决什么痛点。

什么是 DNS persist 模式?

在了解新功能之前,我们先回顾一下传统的 DNS 验证流程。

DNS TXT 记录手动添加界面

在 DNS 服务商后台手动添加 _acme-challenge TXT 记录的示例

传统 DNS API 模式的痛点

在过去,我们要给域名签发泛域名证书(如 *.example.com),通常需要这样做:

  1. 在 acme.sh 中配置 DNS 服务商的 API Key(例如 CloudFlare 的 Global API Key)。
  2. 运行签发命令,acme.sh 调用 API 在 DNS 上添加一条指定的 TXT 记录用于验证。
  3. 验证通过后,证书签发成功,acme.sh 再调用 API 清除这条 TXT 记录。
  4. 60 天后续期时,重复上述步骤

弊端显而易见: 你的服务器上必须一直保存有效的 API 凭证。如果服务器被入侵,或者你的 Docker 镜像不小心泄露,攻击者就能拿到了你的 DNS 管理权限,后果不堪设想。此外,频繁调用 API 也有可能触发限流。

DNS persist 模式的革新

DNS persist 模式的核心逻辑在于“持续存在”。它的流程变成了这样:

  1. 首次配置:你还是需要通过 API 手动添加一次 _acme-challenge.example.com 的 TXT 记录。
  2. 锁定记录:在 acme.sh 中开启 persist 模式,告诉它:“这条记录我已经手动添加好了,并且我会一直保留着,你别去删也不要去动它。”
  3. 自动续期:后续每 60 天续期时,acme.sh 会直接读取这条已经存在的 TXT 记录进行验证,完全跳过 API 调用

这就像是你给 DNS 服务器留了一把“备用钥匙”,但这把钥匙是一次性的永久的,acme.sh 只需要验证这把钥匙还在那里,不需要再去申请权限。

实操:如何配置 DNS persist 模式

说了这么多原理,我们来看看实际操作步骤。这里以手动添加 DNS 记录为例(因为你可能不想在一台机器上存放 API Key)。

第一步:手动添加 DNS TXT 记录

首先,你需要去你的 DNS 服务商后台(比如 CloudFlare、阿里云等),手动添加一条 TXT 记录。

  • Name/Host: _acme-challenge
  • Type: TXT
  • Content: 这是关键。你需要获取一个 Account Key。

获取 Account Key 的命令如下(在一台安全的地方运行):

acme.sh --create-account-key

运行后,acme.sh 会生成一个账户公钥。你需要用这个公钥作为 Content 字段的内容填入 DNS 记录中。

第二步:签发证书并启用 persist 模式

在你的目标服务器上执行签发命令。与传统方式不同的是,你需要加上 --dns 参数并指定一个特殊的标记,或者直接使用 --yes-I-know-dns-manual-mode-enough-go-ahead-please 配合 persist 逻辑。

注意: 最新的使用方法其实是直接利用环境变量告诉 acme.sh 这是一个持久化的验证。

一个比较通用的配置思路是:

export ACME_DNS_MANUAL_PERSIST="yes"

acme.sh --issue -d yourdomain.com -d *.yourdomain.com --dns dns_manual \
    --yes-I-know-dns-manual-mode-enough-go-ahead-please

这里的逻辑是:

  1. dns_manual 表示这是手动 DNS 模式。
  2. ACME_DNS_MANUAL_PERSIST="yes" 告诉 acme.sh:“既然是手动模式,请假设 TXT 记录已经存在并且永久有效,不要试图去验证后删除它,也不要报错说找不到 API。”

(注:具体参数可能跟随版本迭代略有不同,请以官方 Wiki 为准,目前官方 Wiki 已出专门页面讲解 DNS persist mode,建议参照最新文档调整参数细节)

第三步:验证续期

配置完成后,你可以手动触发一次续期来测试是否真的不再需要 API 密钥:

acme.sh --renew -d yourdomain.com -d *.yourdomain.com --force
``

观察日志,你会发现它并没有去请求 CloudFlare 或其他厂商的接口,而是直接解析了 DNS 记录并完成了挑战。

## 进阶玩法:结合 Sing-box 等工具

原作者提到的“如果能写到 singbox 配置里面的自动更新证书就好了”,这是很多折腾代理工具玩家的心声。

目前的 Sing-box 等工具大多支持证书路径配置,但它们本身不具备证书申请能力。结合 acme.sh 的 DNS persist 模式,我们可以构建一个极其安全的自动化环境:

1.  **安全隔离**:DNS TXT 记录只在你本地电脑(安全环境)添加一次,或者在严格控制的服务器上通过 API 添加一次,然后锁定。
2.  **轻量化部署**:你的 VPS(运行 Sing-box 的节点)只需要安装一个极简的 acme.sh,甚至不需要配置任何 API Key 环境变量。它只需要知道证书域名和路径。
3.  **定时任务**:在 VPS 上设置 Cron 任务,定期运行 `acme.sh --renew`。由于已经处于 persist 模式,即使 VPS 被攻破,黑客也只能拿到你的 HTTPS 证书,拿不到 DNS 管理权限,大大缩小了攻击面。

## 总结

acme.sh 的这个 DNS persist 模式虽然改动不大,但对于安全性要求较高的场景来说,非常有价值。它解耦了“域名验证(DNS)”和“服务器环境(证书安装)”,避免了在每台需要证书的服务器上都部署高危的 API 密钥。

如果你手里跑着很多节点,还在为证书续期时频繁调用 API 或担心 Key 安全而烦恼,不妨赶紧试试这个新功能,把 DNS 记录设为“常驻”,让证书续期变得无痛且更安全。

标签: none

AI Skills Smart Station on Nick Launches

评论已关闭