Skip to content

阿里云 CDN 证书自动续期部署方案 ​

更新日期:2026-10-02。目标域名:cdn.xiedao888.cn,服务器:47.121.197.139。

实际状态 ​

CDN 证书自动同步已部署并验收,证书自动续期尚未完成。缺少 DNSPod API 凭证,当前 Certbot lineage 仍使用手动 DNS-01 验证。

当前 Let's Encrypt 证书到期时间为 2026-12-31 12:50:15(北京时间),目录为 /etc/letsencrypt/live/cdn.xiedao888.cn-2026/。阿里云 CDN 的当前证书与该目录中的证书指纹一致,公开图片 HTTPS 请求正常。

已部署:CDN 自动同步 ​

源码:Deploy/cdn-certificate/certificate.py,仅依赖 Python 3 和服务器已安装的 cryptography。

文件/任务作用
/usr/local/lib/xiedao-cdn-certificate/certificate.py校验、上传、验收证书
/etc/xiedao/cdn-certificate.json专用 CDN RAM 用户 AccessKey,root 所有、600 权限
xiedao-cdn-certificate.timer每小时运行一次,随机延迟最多 5 分钟
xiedao-cdn-certificate.service检查本地与 CDN 证书,需要时上传,再验证 HTTPS 图片
certbot.timer原有的 Certbot 续期定时器,已运行;CDN lineage 暂时仍需人工 DNS 验证

同步程序校验域名、有效期、证书与私钥匹配关系,拒绝 Staging 测试证书,只处理指定 CDN lineage,并使用文件锁避免并发。只有证书指纹变化时才调用更新 API;未变化时只查询和验证。失败会返回非零状态并记录在 systemd journal,下次定时执行会重试。到期不足 7 天的本地证书会触发失败状态。

公网验收只检查当前连接到的 CDN 节点,不能代表全部边缘节点。图片检查依赖记录中的现有图片仍然存在;若删除该图片,需要修改源码的 IMAGE_PATH 并重新安装脚本。

凭证从 JSON 文件读取,不放入脚本、进程参数、日志或 Git。文件格式如下,占位符必须替换成真实凭证:

json
{"access_key_id":"<AccessKey ID>","access_key_secret":"<AccessKey Secret>"}

已绑定的最小权限策略为 XiedaoCdnCertificateUpdate,模板见 cdn-certificate-ram-policy.json。允许域名级别的 cdn:SetCdnDomainSSLCertificate 和 cdn:DescribeDomainCertificateInfo。

尚待完成:DNS 自动验证 ​

权威 DNS 为 DNSPod。阿里云 CDN AccessKey 无法修改 DNSPod TXT 记录。需要 DNSPod API Token(ID + Token),或腾讯云 SecretId + SecretKey;拿到凭证后才能配置 _acme-challenge.cdn.xiedao888.cn TXT 的自动创建、等待传播、验证和清理,并用 Certbot 测试环境演练后保存续期配置。

2026-10-02 曾测试通过 OSS 提供 HTTP-01 文件:服务器可读取挑战内容,测试对象也已清理。但两次 certbot reconfigure 均失败,分别为:

  • 异地验证连接 124.200.113.75 超时;
  • 验证连接 117.126.128.11 报 Network unreachable。

因此未保存 HTTP-01 续期配置,测试钩子已经撤下,不把服务器侧访问成功当作自动续期验收成功。现有证书和 CDN 图片仍正常。

完整流程应为:

text
Certbot 定时检查 → DNSPod TXT 自动验证 → 签发新证书
    → deploy hook 上传 CDN → 核对证书指纹和 HTTPS 图片
    → 每小时同步任务补偿发布失败

取得 DNS 凭证并通过自动验证后,需要将以下 deploy hook 保存进该 lineage 的续期配置:

text
/usr/bin/python3 /usr/local/lib/xiedao-cdn-certificate/certificate.py deploy

目前没有保存此 deploy hook;已启用的小时任务会发现并同步该 lineage 的证书变化。

DNSPod 密钥创建参考:DNSPod 官方密钥管理。腾讯云子账号支持更细的 CAM 权限控制;权限应限定本域名的解析记录查询、创建和删除。传统 DNSPod Token 仅支持主账号,应按实际凭证类型配置客户端。

运维命令 ​

只读校验当前配置、私钥匹配关系、API 查询权限和 HTTPS 图片:

bash
/usr/bin/python3 /usr/local/lib/xiedao-cdn-certificate/certificate.py check

立即同步证书(指纹一致时不重复上传):

bash
systemctl start xiedao-cdn-certificate.service
systemctl show xiedao-cdn-certificate.service -p Result -p ExecMainStatus

查看任务和日志:

bash
systemctl list-timers --all certbot.timer xiedao-cdn-certificate.timer
journalctl -u xiedao-cdn-certificate.service -n 50 --no-pager
journalctl -u certbot.service -n 50 --no-pager

停止 CDN 自动同步:

bash
systemctl disable --now xiedao-cdn-certificate.timer

AccessKey 轮换时,在服务器安全编辑 /etc/xiedao/cdn-certificate.json,确认 root 所有和 600 权限,然后运行 check。聊天中提供过的 AccessKey 应轮换;轮换后必须同时更新这个服务器配置文件。

失败状态和日志是本地运维提示,尚未接入邮件、短信或其他外部告警。

验收记录 ​

  • 证书安全校验单元测试:匹配证书、错误域名、Staging、临近到期、错误私钥,以及其他 lineage 的隔离检查。
  • 服务器 check 成功。
  • xiedao-cdn-certificate.service 执行成功,退出状态 0。
  • 小时 timer 已启用,原有 certbot.timer 正常运行。
  • HTTP-01 完整演练失败;DNS 自动验证等待凭证,未宣称自动续期完成。

携岛 XieDao · 内部文档