feat(ssl): ACME 自动签发与自动续期,实现证书全生命周期闭环
证书管家此前只做「探针」(查剩余天数),现补齐签发+部署两个环节,
参照 certimate(MIT)的 DNS-01 流程自行实现,不再依赖闭源 certd。
新增(纯 WebCrypto,零 npm 依赖):
- lib/acme.ts ACME v2 客户端:ES256 JWS(原始 r||s)、RFC7638
thumbprint、EAB、badNonce 重试、DNS-01、手写 DER CSR
- lib/dnsprovider.ts DNS-01 适配:DNSPod(TC3-HMAC-SHA256)、Cloudflare
- lib/deployer.ts 部署适配:多吉云 CDN、1Panel 站点(幂等换证书)
- lib/certissue.ts 编排:探针判剩余天数 → 注册/复用账户 → 签发 → 落库
→ 逐目标部署;RENEW_BEFORE_DAYS=30
- routes/ssl.ts 新增 POST /ssl/issue、GET /ssl/renew-check、
POST /ssl/selfcheck(环境自检,只读不签发)
- index.ts + cron 每日 04:10 自动续期检查;cpu_ms 提到 60s
与 certimate 的差异:certimate 每个 workflow 每天无条件重跑,
这里改为先探针查剩余天数、低于阈值才签,省 CA 限速额度。
实测修正(易误判,勿回退):
- 多吉云 bind 参数是 {id, domain},非 {cert_id}(用假 id 对照实验确认:
cert_id 回「域名不存在」= 参数被无视)
- 多吉云上传私钥字段是 private;列域名用 /cdn/domain/list.json
- 1Panel 必须用 /api/v2/(v1 返回 HTTP 200 但正文是 HTML 停用页)
- 1Panel HTTPS 配置字段是 SSL(大写),写错会导致每次续期都重绑
- LiteSSL ACME 目录须带 /v2:acme.trustasia.com/acme/v2/directory
测试:selftest-acme 16/16(CSR 过 openssl 验签、JWS 过 Node crypto 验签)、
selftest-deploy 18/18、selftest:ssl 117/117、UI 全过、tsc 干净
This commit is contained in:
1 parent
432cf5e398
commit
43dbc8b75f
14 files changed
+3010
-6
No files matched your search
@@ -132,12 +132,22 @@ custom_domain = true
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# 定时任务(合并 rss-robot 的抓取):
|
||||
# 0 * * * * RSS 轮转抓取(每小时一批,约 3 小时覆盖全部源)
|
||||
# 17 3 * * * 评论 GC(限流/验证码清理 + healthz 缓存刷新)
|
||||
# 0 0 * * * RSS 抓取批1(offset 0,35 个源)
|
||||
# 0 12 * * * RSS 抓取批2(offset 35)
|
||||
# 10 4 * * * 证书续期检查(探针查剩余天数,≤30 天才真正签发+部署)
|
||||
# ---------------------------------------------------------------------------
|
||||
[triggers]
|
||||
crons = ["17 3 * * *", "0 * * * *"]
|
||||
crons = ["17 3 * * *", "0 * * * *", "10 4 * * *"]
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# 资源上限
|
||||
# ★ CPU 时间:证书签发要跑多次加密(ECDSA 签名 / SHA-256)与 DER 编码,
|
||||
# 虽然总耗时主要是等在网络上(不算 CPU),但给足余量避免 1102 错误。
|
||||
# cron 的默认上限就是 30s;HTTP 请求默认也是 30s(付费版可提到 5 分钟)。
|
||||
# 免费版会忽略这个字段(免费版硬顶 10ms,签发功能在免费版上不可用)。
|
||||
# ---------------------------------------------------------------------------
|
||||
[limits]
|
||||
cpu_ms = 60000
|
||||
|
||||
[observability]
|
||||
enabled = true
|
||||
Reference in new issue
Block a user