侧边栏壁纸

acme.sh + DNSPod 自动签发泛域名 SSL 证书并部署到雷池 WAF(SafeLine)

2026年08月20日 13阅读 0评论 2点赞

使用 acme.sh 为腾讯云 DNSPod 域名自动签发泛域名 SSL 证书并部署到雷池 WAF

适用场景:域名在腾讯云购买、DNS 解析托管在 DNSPod,网站使用雷池 WAF(SafeLine)社区版 ≥ 7.2.0 做反向代理,希望为域名(含泛域名 *.example.com)自动获取 Let's Encrypt 免费证书,并自动部署到雷池,实现 90 天自动续期、零人工干预。

最终效果:acme.sh 每天自动检查证书有效期,到期前 30 天自动续签,并将新证书写入雷池证书目录、自动 reload Nginx,全程无需人工操作。


一、前置条件

  • 服务器环境:一台 Linux 服务器(本文基于 Ubuntu/Debian),已安装 Docker 并运行雷池 WAF。
  • 雷池版本:≥ 7.2.0(支持证书目录热加载,每小时自动扫描一次)。
  • 域名:已在 DNSPod 中添加解析(NS 指向 DNSPod)。
  • DNSPod API Token:在 DNSPod 控制台 → 用户中心 → 安全设置 → API Token 中创建。

    • 注意:这里用的是老版 DNSPod Token(纯数字 ID + 字符串 Token),不是腾讯云 API 密钥(AKID 开头)。本教程使用 dns_dp 插件。
  • 有效邮箱地址:用于 Let's Encrypt 账户注册,不能是 example.com 等保留域名。

二、详细步骤

1. 在雷池 WAF 中手动上传一次证书(占位)

这一步是为了让雷池在宿主机生成证书文件占位,后续 acme.sh 才能覆盖写入。

  1. 登录雷池管理界面 → 通用设置 → 证书管理 → 添加证书。
  2. 上传一张已有的证书(可以是腾讯云之前的 90 天证书,也可以临时用自签名证书)。
  3. 上传成功后,登录雷池宿主机,查看证书目录:
ls /data/safeline/resources/nginx/certs/

你会看到类似 cert_1.crtcert_1.key 的文件,记下编号(例如 cert_1),后续步骤会用到。

2. 安装 acme.sh

curl https://get.acme.sh | sh -s email=you@example.com
source ~/.bashrc

3. 设置 DNSPod Token 环境变量(临时)

export DP_Id="你的DNSPod Token ID(纯数字)"
export DP_Key="你的DNSPod Token 字符串"
注意:此环境变量只在当前终端会话有效。acme.sh 签发成功后会把 Token 保存进域名配置文件,后续续期无需再次 export。

4. 切换默认 CA 为 Let's Encrypt(可选但推荐)

acme.sh --set-default-ca --server letsencrypt

5. 签发泛域名证书

acme.sh --issue --dns dns_dp \
  -d example.com \
  -d '*.example.com' \
  --accountemail "your_real_email@example.com" \
  --debug 2

参数说明:

  • -d example.com:包含根域名。
  • -d '*.example.com':包含所有一级子域名(注意单引号防止 shell 展开)。
  • --accountemail:必须使用真实邮箱,否则 Let's Encrypt 会拒绝注册。
  • --debug 2:可选,用于查看详细日志。

如果一切顺利,会看到 Cert success.,证书文件保存在 ~/.acme.sh/example.com_ecc/ 下。

6. 安装证书到雷池 WAF 目录并设置自动 reload

acme.sh --install-cert -d example.com \
  --key-file  /data/safeline/resources/nginx/certs/cert_1.key \
  --fullchain-file /data/safeline/resources/nginx/certs/cert_1.crt \
  --reloadcmd "docker exec safeline-tengine nginx -s reload"
  • cert_1 替换为你在第 1 步中看到的实际编号。
  • 此命令会把证书文件写入雷池目录,并执行 reload 使新证书立即生效。
  • acme.sh 还会自动创建 cron 任务:每天检查证书有效期,到期前 30 天自动续期并再次执行上述安装和 reload。

7. 验证证书是否生效

echo | openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -subject -dates

正常输出类似:

subject=CN = example.com
notBefore=Aug 20 01:31:33 2026 GMT
notAfter=Nov 18 01:31:32 2026 GMT

三、注意事项

  • Token 安全:DNSPod Token 具有修改 DNS 记录的权限,切勿泄露。一旦泄露,应立即在 DNSPod 控制台禁用并重建。
  • 邮箱要求:Let's Encrypt 不允许使用 example.comtest.com 等保留域名作为联系邮箱,必须使用真实邮箱(QQ、Gmail 等均可)。
  • 泛域名写法:必须同时包含根域和 *.,即 -d example.com -d '*.example.com',缺一不可;*. 必须加单引号。
  • 雷池证书编号cert_1 是示例,实际编号取决于你在雷池中上传的顺序,可通过 ls /data/safeline/resources/nginx/certs/ 确认。
  • DNS 传播时间:如果遇到验证超时,可添加 --dnssleep 120 让 acme.sh 等待更长时间再验证。
  • 服务器网络:如果服务器无法连接国外 DNS(如 Google DNS、Cloudflare DNS),acme.sh 会自动降级使用阿里云 DoH(dns.alidns.com),通常不受影响。

四、踩过的坑(常见问题及解决方法)

坑 1:使用了错误的密钥类型

  • 现象AuthFailure.SecretIdNotFound
  • 原因:把 DNSPod 老版 Token(纯数字 ID + 字符串)当成了腾讯云 API 密钥(AKID 开头),并用 dns_tencent 插件。
  • 解决:使用 dns_dp 插件,并设置 DP_IdDP_Key 环境变量。

坑 2:Let's Encrypt 注册邮箱被拒

  • 现象Error validating contact(s) :: contact email has forbidden domain "example.com"
  • 原因:acme.sh 默认邮箱为 you@example.com,该域名被 Let's Encrypt 列入黑名单。
  • 解决:用 --accountemail 参数指定真实邮箱,或修改 account.conf 中的 ACCOUNT_EMAIL

坑 3:账户缓存导致邮箱未更新

  • 现象:即使设置了 export ACCOUNT_EMAIL,请求中仍然使用旧邮箱。
  • 原因:acme.sh 缓存了旧账户配置。
  • 解决:删除缓存目录后重新签发:
rm -rf /root/.acme.sh/ca/acme-v02.api.letsencrypt.org

坑 4:DNS 验证成功但签发卡住

  • 现象:日志显示 All checks succeeded 后长时间无反应。
  • 原因:通常由于网络波动或 Let's Encrypt 处理延迟,耐心等待即可(一般不超过 30 秒)。
  • 解决:若持续超时,可尝试 --dnssleep 120

坑 5:雷池 reload 失败 / 证书未生效

  • 现象Reload successful 但证书未生效。
  • 原因:雷池界面显示可能有缓存,实际 tengine 已加载新证书。
  • 解决:以 openssl s_client 查询结果为准。

坑 6:续期时 Token 失效

  • 现象:续期时报 login_token invalid
  • 原因:Token 被禁用或更换,但 acme.sh 仍使用旧 Token。
  • 解决:更新域名配置文件中的 DP_IdDP_Key,然后执行测试:
acme.sh --renew -d example.com --force

五、最终自动化验证

执行以下命令,确认 cron 任务已添加:

crontab -l | grep acme

输出应包含类似:

0 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

此后,证书将在到期前 30 天自动续期并部署,无需再手动操作。如需手动模拟续期,可运行:

acme.sh --renew -d example.com --force

教程结束。替换文中的 example.com、Token、邮箱、证书编号为你的实际值即可直接使用。

2
打赏

—— 评论区 ——

昵称
邮箱
网址
取消
博主栏壁纸
6 文章数
22 标签数
29 评论量
人生倒计时
舔狗日记