在申请SSL证书中acme.sh 的 DNS API 模式是其最强大的进阶功能,特别适合需要申请通配符证书或无法通过 HTTP 验证的复杂网络环境。它的核心原理是利用 DNS 服务商的 API 接口,自动化地添加和删除用于验证的 TXT 记录,从而实现从申请到续期的全流程无人干预。
下面我会为你梳理出从配置到优化的完整指南。
核心机制与优势
DNS API 验证的工作流程非常简洁高效:
1. 你在环境中配置好 DNS 服务商的 API 凭证。
2. `acme.sh` 在申请证书时,通过 API 自动为你的域名添加一个特定的 TXT 记录。
3. 等待记录全球生效(可通过参数控制等待时间)后,Let's Encrypt 等证书颁发机构(CA)通过查询该 TXT 记录来验证你对域名的所有权。
4. 验证通过,证书成功签发。
5. `acme.sh` 再次通过 API 自动清理(删除)这条临时的 TXT 记录,保持 DNS 区域整洁。
主流 DNS 服务商配置示例
`acme.sh` 支持超过100家DNS服务商。配置方式大同小异,核心就是通过环境变量设置 API 凭证,然后用 `--dns` 参数指定提供商。下面以几个最常用的服务商为例进行说明:
服务商 插件名称 必需的环境变量 示例命令
Cloudflare `dns_cf` | `CF_Token` (API令牌)<br>`CF_Zone_ID` (域名Zone ID) | `export CF_Token="你的令牌"` <br> `export CF_Zone_ID="你的Zone ID"` <br> `acme.sh --issue --dns dns_cf -d example.com -d "*.example.com"`
DNSPod / 腾讯云 `dns_tencent` `Tencent_SecretId`<br>`Tencent_SecretKey` `export Tencent_SecretId="你的SecretId"` <br> `export Tencent_SecretKey="你的SecretKey"` <br> `acme.sh --issue --dns dns_tencent -d example.com -d "*.example.com"`
Aliyun / 阿里云 `dns_ali` | `Ali_Key`<br>`Ali_Secret` `export Ali_Key="你的Key"` <br> `export Ali_Secret="你的Secret"` <br> `acme.sh --issue --dns dns_ali -d example.com -d "*.example.com"`
GoDaddy `dns_gd` `GD_Key`<br>`GD_Secret` `export GD_Key="你的Key"` <br> `export GD_Secret="你的Secret"` <br> `acme.sh --issue --dns dns_gd -d example.com -d "*.example.com"`
Amazon Route53 `dns_aws` `AWS_ACCESS_KEY_ID`<br>`AWS_SECRET_ACCESS_KEY` `export AWS_ACCESS_KEY_ID="你的KeyId"` <br> `export AWS_SECRET_ACCESS_KEY="你的SecretKey"` <br> `acme.sh --issue --dns dns_aws -d example.com -d "*.example.com"`
> 请注意:首次成功签发后,你设置的这些 API 凭证会被 `acme.sh` 自动保存到 `~/.acme.sh/account.conf` 文件中,以便后续自动续期时使用。
进阶技巧与优化
掌握基础配置后,你可以通过以下技巧进一步优化使用体验:
1. 优化等待时间,提升签发速度:`--dnssleep` 参数用于控制 `acme.sh` 在添加 TXT 记录后等待的时间(秒),以便 DNS 记录在全球生效。默认值通常比较保守。如果你使用的 DNS 服务商解析速度很快(例如 Cloudflare、Route53),可以适当将这个值调低,如 `--dnssleep 30`,从而将证书签发时间从几分钟缩短至几十秒。
bash
acme.sh --issue --dns dns_cf --dnssleep 30 -d example.com -d "*.example.com"
2. 精细调优,适应不同环境:除了 `--dnssleep`,你还可以通过环境变量调整重试机制来适应不同的网络环境或应对临时的API波动。
bash
# 在高速稳定网络环境中,适当降低重试次数
export MAX_REQUEST_RETRY_TIMES=10
export MAX_API_RETRY_TIMES=5
acme.sh --issue --dns dns_cf -d example.com -d "*.example.com"
3. 调试模式,精准定位问题:如果遇到问题,可以为命令添加 `--debug` 参数(如 `--debug 2`),这将输出详细的日志信息,帮助你分析是 API 凭证错误、网络问题还是 DNS 传播超时。
安全性实践
为了确保证书管理过程的安全,建议遵循以下最佳实践:
最小权限原则:在 DNS 服务商的管理后台,为 acme.sh 创建一个专用的 API 令牌(Token),并确保该令牌的权限仅限于 DNS 记录的管理,不要授予其删除整个域名或修改账户信息等高级权限。例如在腾讯云,可以创建一个只授权了 `dnspod:CreateRecord` 和 `dnspod:DeleteRecord` 等操作权限的子账号。
环境变量临时性:通过 `export` 命令设置的环境变量仅在当前终端会话中有效。这样可以避免凭证被永久记录在命令历史中。
配置文件安全:`acme.sh` 虽然会将凭证存储在 `~/.acme.sh/account.conf`,但会妥善处理其文件权限。你无需额外操作,但不应手动编辑或泄露此文件。
你目前使用的是哪家 DNS 服务商?如果有具体的配置需求或遇到问题,可以告诉我,我为你们提供更针对性的指导。