主题
阿里云 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.timerAccessKey 轮换时,在服务器安全编辑 /etc/xiedao/cdn-certificate.json,确认 root 所有和 600 权限,然后运行 check。聊天中提供过的 AccessKey 应轮换;轮换后必须同时更新这个服务器配置文件。
失败状态和日志是本地运维提示,尚未接入邮件、短信或其他外部告警。
验收记录
- 证书安全校验单元测试:匹配证书、错误域名、Staging、临近到期、错误私钥,以及其他 lineage 的隔离检查。
- 服务器
check成功。 xiedao-cdn-certificate.service执行成功,退出状态 0。- 小时 timer 已启用,原有
certbot.timer正常运行。 - HTTP-01 完整演练失败;DNS 自动验证等待凭证,未宣称自动续期完成。