Scert/doc/初始化目录与代理校验说明.md

86 lines
8.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 初始化目录与代理校验
## 证书目录自动创建
第四步先校验证书目录,再验证实际写入。已有写权限时直接创建缺失目录;Linux 权限不足时调用随正式发布包安装的 `Scert-storage.socket` 和 `Scert-storage.service`。它们是正式产品组件,不是临时测试脚本。
- 主服务仍使用普通 `Scert` 账户,不增加 root 身份、系统管理能力或整个文件系统的写权限。
- 目录服务仅监听 `/run/scert-storage/prepare.sock`,通过内核身份验证调用者;主服务也验证服务端为 root。
- 只接受证书路径,不接受 shell 命令、其他服务名称或任意配置位置。
- 默认批准 `/ssl`、`/var/lib/scert/certificates`,安装器的 `--certificate-dir` 可额外批准一个存储范围。输入其他路径不会自动扩大批准范围。
- 新目录由服务创建,最终目录归 `Scert` 所有、权限为 `0700`。不递归修改已有文件,不接管其他账户的目录。
- 特权操作的父目录必须仅 root 可写,逐层拒绝符号链接。已可写的证书子目录由普通账户直接创建,不需要特权操作。
- 通过 systemd 的 `bind` 操作只开放所选目录,随后保存对应的 `ReadWritePaths`,不重启初始化服务、不丢失在线验证会话。需要支持该操作的 systemd;不支持时明确失败,不降级放开权限。
- 安装器升级前须停止目录服务及 socket,正式主服务启动时会拉起 socket。无需手动创建用户填入的证书叶目录。
## 代理与证书信任
测试环境证书不受系统公共 CA 信任。当前代理管理模式要求管理域名及正式环境证书;测试环境和 IP 自签名管理入口应使用直接 HTTPS。前后端均在提交前拒绝不支持的组合,后端不会消耗验证令牌或申请证书。
正式代理模式申请候选证书后,先临时监听配置的上游 HTTPS 端口,再访问真实管理域名与代理公开端口。连续三次请求必须通过公共 TLS 验证,且返回本次随机生成的响应。代理返回 502、错误服务的 200、重定向、证书链不可信或端口不一致均不能提交初始化。
代理需要将管理入口路径转发到所选上游端口,包括 `/.well-known/scert-setup/`。预检不关闭 TLS 校验、不修改代理信任库、不使用环境代理、不强制解析到测试 IP。
预检通过后关闭临时监听,保存配置并启动正式应用;预检失败则保留初始化未完成状态,并回滚候选管理证书。该检查不能替代正式应用启动、续期、推送、重启及完整生产部署验收。
## 2026年9月27日实机复核
本轮为已有故障现场的恢复复测,没有清空数据库,不属于全新初始化验收。业务操作使用浏览器页面,SSH 仅用于部署、服务及文件核验;没有新增辅助验收脚本,也没有直接调用业务接口。
### 发布身份
- 已部署源码提交:`9ac222d6db61ce0daeecb846da42852778a1036c`。
- 实机主程序 SHA-256:`c5f03a2c74a6a259ac07ab39d31239e267936a62b8f1d0de83bdef3f1c9549c1`。
- 本节文档提交晚于部署提交,不表示重新构建或部署了不同的业务代码。
### 本轮确认结果
- [✓] 自动创建的证书目录 `/ssl/scert-auto-0927` 为 `Scert:Scert 0700`,父目录 `/ssl` 保持 `root:root 0755`;持久授权仅包含所选目录,没有放开整个 `/ssl`。
- [✓] 重启 Scert 后,目录权限及 `ReadWritePaths` 保留,Scert、目录服务 socket 和 Nginx 均为运行状态;管理入口返回 HTTP 200,公共 TLS 校验结果为零。
- [✓] 重启后通过浏览器重新登录成功,首页仍显示托管域名正常及原有到期时间。
- [✓] Nginx 上游继续使用 HTTPS,并保留 `proxy_ssl_verify on`;未修改信任库或关闭证书校验。
- [✓] 上轮已保存证书但 SSH 推送失败,恢复服务器端口后,本轮仅点击“部署证书”,未重新导入。页面显示一台成功,域名从错误恢复正常。
- [✓] 第二台服务器实际 TLS 握手提供的证书序列号、到期时间和 SHA-256 指纹与导入证书一致;域名及证书链验证通过。此项为目标机实际 SNI/TLS 检查,不冒充公共 DNS 验收。
- [✓] 第二台已有六个服务的主进程和重启计数、Nginx 配置摘要、三组原业务证书及私钥摘要均与推送前基线一致;两个既有 HTTPS 站点仍返回 HTTP 200,TLS 校验结果为零。
- [✓] 按已获授权定点移除本轮安装器升级事务副本,未删除本地未跟踪文件、当前发布目录或其他业务文件。
### 本地回归范围
Windows 上重新运行 `go test ./internal/bootstrap ./internal/certstorage ./internal/httpapi ./internal/admin`,适用测试通过。目录服务的 Linux 专属测试在此平台不会执行,不能将此结果记为 Linux 权限测试通过。前端 `npm test` 共 141 项通过。
### 仍未完成的生产门槛
- [x] 目录自动创建及代理模式防护代码已部署;完整首次生产初始化仍待实机复审。
- [!] 管理域名正式签发存在已记录的 ACME 限流:服务器日志时间为 2026年9月26日 14:18:53 UTC,`retry_after_seconds=73024`。据此计算,最早重试时间为北京时间 2026年9月27日 18:35:57;此时间只代表该次响应的等待下限,不保证届时签发一定成功。本轮没有盲目重试签发。
- [ ] 全新正式签发、真实代理预检、初始化提交、正式应用启动和浏览器登录的连续链路尚未完成验收。
- [ ] 当前管理入口仍依赖此前人工恢复的正式证书,不能把入口可访问当作产品自动签发链路已通过。
测试环境与严格校验的代理管理入口不兼容时,产品会在提交前明确拒绝,要求选择正式环境或直接 HTTPS;不会静默切换环境、跳过验证或事后人工替换证书来宣称初始化成功。
## 2026年9月27日安全退出补充复核
继续已有故障现场的增量修复,未清库、未重新签发管理证书,不计作全新初始化验收。本轮未修改第二台服务器,未新增辅助验收脚本;实机业务操作均通过浏览器页面完成。
### 修复与发布身份
- 为管理控制台侧栏底部补齐退出入口,复用现有退出接口,保留执行中禁用和中文错误提示。
- 第一版实机复测发现:退出后浏览器后退会恢复缓存中的旧控制台。该版未被记为退出验收通过。
- 第二版在页面离开时清除前端已验证权限,在历史缓存恢复时重新检查会话;检查完成前不展示旧业务内容。请求版本隔离防止离开前的在途响应覆盖新会话状态。
- 最终部署源码提交:`41d6137716b864fd43e6875a128aa3f24f53ccf7`,发布清单 `source_dirty=false`。
- 主程序 SHA-256:`ce3ac4c20caff9db4b287fdfd125a80ef604a9e5c1b6a7cd4192726e9b5140e4`。
- 归档 SHA-256:`c00c7a2f9ec05a1195821c5c6beb6f4f0c1d475eac1373b2815495b7ec349daa`。
- 本节文档及检查点提交晚于部署提交,不表示另一个业务版本已上线。
### 分层结果
- [✓] 新增五项退出交互测试、四项历史缓存与在途请求回归测试,前端共 150 项通过,生产构建通过。
- [✓] Windows 上初始化、接口和本地管理相关 Go 回归通过;`certstorage` 在 Windows 上没有可运行的 Linux 专属测试,不能将其记为 Linux 权限测试通过。
- [✓] 正式安装器升级后,实机主程序与本地发布包摘要一致。
- [✓] 超级管理员页面实际点击退出后进入登录页;后退仍显示登录页,浏览器自动发起的会话检查返回 401;强制刷新后仍未登录。
- [✓] 页面重新登录成功,侧栏退出入口可见,托管域名保持正常,证书到期时间保持不变。
- [✓] 升级后 `/ssl/scert-auto-0927` 仍为 `Scert:Scert 0700`,父目录仍为 `root:root 0755`,持久写入授权没有扩大到整个父目录。
- [✓] Scert、目录服务 socket、Nginx 运行正常,公共入口 HTTP 200、TLS 校验成功,上游继续保持 `proxy_ssl_verify on`。
- [✓] 核对绝对路径后定点移除本轮两份安装器升级事务副本,未删除本地历史未跟踪文件。
- [ ] 普通管理员、普通用户的退出入口未在本轮重新逐角色实机复测;不能以超级管理员结果冒充全部角色验收。
- [!] 全新正式签发初始化仍受此前记录的 ACME 限流约束,最早重试时间仍为北京时间 2026年9月27日 18:35:57。现有人工恢复管理证书不算自动签发验收证据。