diff --git a/.claude/docs/ai/async-tasks/api-handoff.md b/.claude/docs/ai/async-tasks/api-handoff.md index 2108848..3e4828d 100644 --- a/.claude/docs/ai/async-tasks/api-handoff.md +++ b/.claude/docs/ai/async-tasks/api-handoff.md @@ -82,6 +82,15 @@ 前端使用独立 RenewalAction.js 管理提交状态和幂等键,复用任务详情跟踪结果;禁止重复点击时并发提交,不能仅凭受理响应显示续期完成。 +## 证书历史版本恢复 + +- `GET /api/v1/domains/:id/certificate/versions` 返回当前证书及可恢复的本地历史版本;前端使用 `history_id` 作为稳定恢复标识,不使用列表序号或展示版本号。 +- `POST /api/v1/domains/:id/certificate/versions/:history_id/restore` 不接收证书内容,使用 `Idempotency-Key` 提交恢复任务;成功返回 `202 Accepted`、`accepted=true`、`task` 和 `Location: /api/v1/tasks/任务编号`。 +- 恢复任务必须通过域名可见性、证书管理、部署执行和私钥读取权限复核;当前证书、过期版本、未生效版本、域名不匹配或证书类型不匹配不得恢复。 +- 同域名存在活动恢复任务时返回冲突及原任务信息;相同幂等键重放时返回原任务,不重复执行。前端必须继续查询任务详情,不能凭 202 或 200 直接显示恢复完成。 +- 恢复范围仅为 Scert 本地托管证书历史;任务完成不代表远端服务器已经部署新证书,远端部署必须使用独立部署任务并单独确认。 +- 响应及错误信息不得暴露私钥内容、私钥路径、证书存储本地路径或服务器路径。 + ## 数据模型 | 模型 | 字段 | diff --git a/doc/Scert整改合并优化清单.md b/doc/Scert整改合并优化清单.md index 9b2594d..27253b9 100644 --- a/doc/Scert整改合并优化清单.md +++ b/doc/Scert整改合并优化清单.md @@ -1,5 +1,14 @@ # Scert 整改、合并与优化清单 +## 2026年10月2日 当前开发进度:证书历史版本恢复前端闭环完成 + +- [x] P1-02:后端已实现本地证书历史版本读取、版本校验、恢复任务持久化、幂等提交、活动任务冲突、失败收敛及权限复核;恢复仅更新 Scert 本地托管证书,不宣称远端部署完成。 +- [x] P2-03 配套:前端已接入历史版本列表、稳定 `history_id` 恢复、二次确认、`Idempotency-Key`、202 任务受理和任务详情跟踪;当前版本不可重复恢复。 +- [x] 前端补充历史版本弹窗布局及移动端适配;证书恢复专项测试、前端全量测试 275 项和 Vite 生产构建通过;修复恢复成功后任务详情入口调用错误。 +- [x] 代码已提交并推送:`b75773b 完善证书历史版本恢复页面与测试`。 +- [~] 接下来执行 Linux 后端全量回归、候选包构建、双机正式部署及浏览器生产验收;本批尚未据此宣布生产验收通过。 +- [!] 既有生产门禁仍保留:第一台证书 SAN、重启早期 502、Smail 系统账户发信、密码重置、三数据库首次 Web、DNS/ACME 负向矩阵及双机实机证据。 + ## 2026年10月2日21:40 当前开发进度:历史版本与恢复 - [~] P1-02:已确认真实存储仍不支持历史恢复,开始补齐本地历史归档读取、恢复校验与失败回滚,不以模拟接口测试代替实现。