推荐通过 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 确认任务是否存在。
验证与调试
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