如何通过 DNS API 配置腾讯云解析实现 Let's Encrypt 泛域名证书续签?

文章导读
推荐通过 acme.sh 脚本配合腾讯云 DNS API 完成 DNS-01 验证,这是目前自动化续签泛域名证书最成熟的方案,适合需要长期维护的 Linux 服务器环境。
📋 目录
  1. 命令速用版
  2. 核心原理
  3. 腾讯云 CAM 权限配置
  4. 详细配置步骤
  5. 验证与调试
  6. 常见坑与排查
  7. 参考来源
A A

推荐通过 acme.sh 脚本配合腾讯云 DNS API 完成 DNS-01 验证,这是目前自动化续签泛域名证书最成熟的方案,适合需要长期维护的 Linux 服务器环境。

先说结论:泛域名证书必须使用 DNS-01 验证方式,手动操作无法实现自动续签,必须配置 API 权限让脚本自动添加 TXT 记录。

  • 适合:持有腾讯云域名且需要 *.example.com 泛域名证书的场景
  • 先准备:腾讯云 API 密钥(SecretId/SecretKey)及子账号 DNS 解析权限
  • 验收:确保证书到期前自动触发续签且业务无中断

命令速用版

# 1. 安装 acme.sh
curl https://get.acme.sh | sh

# 2. 配置腾讯云 API 密钥(推荐写入 ~/.acme.sh/account.conf 避免 cron 环境变量丢失)
export Tencent_SecretId="你的 SecretId"
export Tencent_SecretKey="你的 SecretKey"

# 3. 签发证书(首次)
~/.acme.sh/acme.sh `--issue` `--dns` dns_txcloud -d example.com -d *.example.com

# 4. 安装证书到 Nginx
~/.acme.sh/acme.sh `--install-cert` -d example.com -d *.example.com `--key-file` /etc/nginx/ssl/key.pem `--fullchain-file` /etc/nginx/ssl/fullchain.pem `--reloadcmd` "systemctl reload nginx"

# 5. 查看自动续签定时任务
crontab -l

核心原理

Let's Encrypt 官方规定泛域名证书(Wildcard Certificate)不支持 HTTP-01 验证,只能通过 DNS-01 验证证明你拥有域名的管理权。这意味着续签时必须在域名解析记录里添加一条特定的 TXT 记录。如果靠人工去控制台添加,证书 90 天有效期一到就会中断,所以必须通过 API 让脚本自动完成“添加记录 - 验证 - 删除记录”的流程。

腾讯云 CAM 权限配置

为确保脚本能自动添加/删除 TXT 记录,子账号需具备 DNS 解析权限。生产环境建议先使用全权策略测试,稳定后可细化。建议直接授予 Qcloud_DNSFullAccess 权限以确保验证通过,生产环境可后续细化策略。

{
  "version": "2.0",
  "statement": [
    {
      "effect": "allow",
      "action": [
        "dns:DescribeDomainList",
        "dns:DescribeRecordList",
        "dns:CreateRecord",
        "dns:DeleteRecord",
        "dns:ModifyRecord"
      ],
      "resource": ["*"]
    }
  ]
}

详细配置步骤

1. 准备 API 密钥与权限
登录腾讯云控制台,访问访问管理(CAM)页面。建议新建一个子用户,仅授予 DNSPod 域名解析相关权限。生成密钥后保存 SecretId 和 SecretKey,这两个信息后续不会再显示。

2. 安装配置 acme.sh
在服务器上执行安装命令。安装完成后,将 API 密钥配置到环境变量或 acme.sh 的配置文件中。配置到 ~/.acme.sh/account.conf 中更安全,避免环境变量泄露。注意配置文件权限应设为 600。

3. 签发与部署
使用 dns_txcloud 参数执行签发命令。签发成功后,证书文件默认存储在 ~/.acme.sh/ 目录下。不要直接引用该目录下的文件,应使用 `--install-cert` 命令将证书复制到业务目录(如 /etc/nginx/ssl/),并配置重载命令,这样续签后服务会自动加载新证书。

4. 确保持续化
acme.sh 安装时会自动创建 cron 定时任务,每天零点检查证书有效期。如果剩余时间少于 30 天会自动续签。可以通过 crontab -l 确认任务是否存在。

如何通过 DNS API 配置腾讯云解析实现 Let's Encrypt 泛域名证书续签?

验证与调试

1. 检查证书有效期
使用 OpenSSL 命令查看当前证书到期时间:
openssl s_client -connect example.com:443 -servername example.com | openssl x509 -noout -dates
确认 notAfter 日期是否已更新。

2. 日志查看与调试
如果续签失败,查看 acme.sh 日志定位问题:

cat ~/.acme.sh/acme.sh.log
# 强制重试并输出调试信息
~/.acme.sh/acme.sh `--renew` -d example.com `--force` `--debug` 2
观察输出日志中是否有“Verify success”字样,且没有权限报错。

3. 业务访问检查
浏览器访问 HTTPS 站点,点击锁图标查看证书信息,确认颁发者为 Let's Encrypt 且包含泛域名记录。

常见坑与排查

1. 权限不足导致验证失败
如果子账号权限策略配置过窄,脚本无法添加 TXT 记录,续签会报错。确保 CAM 策略包含域名解析写入权限。建议直接授予 Qcloud_DNSFullAccess 权限以确保验证通过,生产环境可后续细化策略。

2. 定时任务环境变量丢失
Cron 执行环境与用户登录环境不同,可能导致找不到 API 密钥。建议将密钥写入 ~/.acme.sh/account.conf 文件,而不是仅依赖 ~/.bashrc 中的 export。

3. DNS 传播延迟
极少数情况下,添加 TXT 记录后 Let's Encrypt 服务器未能立即读取到,导致验证超时。acme.sh 默认有重试机制,通常无需干预,若频繁失败可检查本地 DNS 设置。

4. 证书路径引用错误
续签后证书文件内容会更新,但文件路径不变。如果 Nginx 配置引用的是 acme.sh 内部目录,建议仍通过 `--install-cert` 复制到固定路径,避免权限或 SELinux 问题导致服务启动失败。

参考来源

  • Let's Encrypt 官方文档,Wildcard Certificates,https://letsencrypt.org
  • acme.sh 项目 Wiki,DNS API 使用说明,https://github.com/acmesh-official/acme.sh
  • 腾讯云官方文档,DNSPod API 密钥管理,https://cloud.tencent.com