Smail/docs/证书托管续期策略验收.md
smail 9c450f1734
Some checks are pending
Security Checks / security (push) Waiting to run
运行时配置清理阶段检查点
2026-10-05 01:31:34 +08:00

77 lines
9.1 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.

# 证书托管续期策略验收
> 2026-09-20 更新:当前云端已使用项目托管、内置 AliDNS 自动挑战及 Nginx 原生 systemd 换证同步。真实 staging 新挑战、生产续期入口和自动同步均通过,仍未完成自然到期的长期调度验收。生产 CA 复用已有授权,未在该轮重新执行挑战。最新源码、实测证据和边界见《云端全项目测试报告》。下文 2026-09-18 的模式与未完成项保留为历史记录。
## 确认的需求
- 项目自身托管:使用项目内置 ACME 申请及自动续期。
- 手动配置:不自动申请或续期,保留证书文件校验和热加载。
- 代理服务器托管:Smail 不自动申请或续期,邮件协议仍要求有效证书。
- 不新增外部部署或续期脚本依赖。
## 实现
`Config.EffectiveSSLType` 统一计算有效策略,明确的证书管理方式优先于旧 `SSLType` 字段。只有没有管理方式及存储模式的旧配置才使用原类型;未知管理方式禁止自动申请。网页 HTTPS 配置为反代模式时仍禁止项目申请。
初始化展示、域名范围、HTTP/DNS 挑战选择、定时续期及运行证书校验使用统一策略。自托管每 24 小时检查一次,剩余时间不足 30 天、证书无效或域名不匹配时尝试更新;手动及代理托管只检测本地证书变化。DNS 验证目前仍需要完成 TXT 记录设置,启用内置检查不等于 DNS 已实现无人值守。
前端三项选择明确显示自动续期状态。线上当前为 `custom`,不得因这次修改自动切换为 `project`。
## 验证状态
- [✓] Linux 服务器隔离执行 15 组策略组合及旧配置兼容测试。
- [✓] 手动与代理托管残留 HTTP/DNS 自动字段时,申请、续期均被拒绝,无 ACME 网络请求或配置改写。
- [✓] 定时任务在项目、手动、代理托管之间切换后读取最新策略。
- [✓] 前端相关 23 项回归通过,包括三种选项、初始化反代限制和 Vue 模板渲染。
- [✓] 前端生产构建及 Linux 主程序构建通过。
- [✓] 第一份候选在服务器空库、独立网络及挂载目录中完成初始化、Nginx HTTPS 上游、SMTP/IMAP/POP3、中文正文及附件收信、过载恢复验收。
- [✓] 补充热加载校验后,重建三个内嵌插件、Telegram 界面和主程序,最终候选隔离验收通过。
- [✓] 正式部署、可信 HTTPS、邮件 TLS、双库完整性和启动日志检查。
- [✓] 浏览器禁用缓存重新加载正式登录页,中文文字和表单正常显示。
- [!] 登录后浏览器业务验收尚未完成,需要有效的 Smail 网页登录凭据;SSH 凭据不作为邮箱凭据使用。
第一份候选 SHA-256 为 `ec6b89a10eef5e7359e057c69d1afa3ff6ad8517ffe84b8e4c5dde9151943e21`,运行测试用时 39.91 秒,Smail 内存峰值 77,729,792 字节,Nginx 3,604,480 字节,交换空间为零。两个测试数据库完整性检查均为 `ok`,四个正式服务进程未变化,无新增 OOM,测试邮件未写入生产库。
## 最终构建与正式部署
2026-09-18 15:24 部署源码提交 `e05d1ff5719f3a516f7d449504130d4ea65e4862`,运行版本为 `review-e05d1ff`。主程序 SHA-256 为 `56d426732dbf3596ad943ac6ed65b5b504101b05f82855d0e89368ce01bfeee8`,与服务器文件一致。三个内嵌插件均核对为当前提交;正式插件配置仍保持原有禁用状态,因此没有宣称插件业务功能已通过实机验收。
最终候选使用新空库,在服务器独立网络及挂载目录中执行完整验收,用时 40.17 秒。初始化、登录会话、正式配置接口、Nginx HTTPS 上游、三种邮件协议授权码、中文邮件及附件、过载恢复均通过。Smail 内存峰值 77,873,152 字节,Nginx 3,612,672 字节,测试进程交换空间为零,无新增 OOM,测试双库完整性正常,生产服务与业务数据未被测试修改。
停服后备份程序、配置、证书和数据,再直接安装三个可执行文件并启动 Smail,没有使用部署脚本。备份位于 `/var/backups/smail-release-20260918-vGc1otF8`,目录仅 root 可访问。程序更新后五个配置文件和现有证书的哈希不变,仍为手动托管;两份正式数据库完整性检查均为 `ok`。HTTPS 健康检查、465/993/995 的 TLS 1.3 主机名及信任链验证通过。Smail 正常启动且自动重启次数为零,Nginx、MySQL、Scert 的进程与运行实例未改变。
验收日志保存在备份目录的 `verification` 子目录。本次四个 `/var/tmp/smail-*` 上传及测试目录已清理,临时测试单元已停止。浏览器已验证正式登录页;真实 CA 续期、登录后的证书设置操作和先前待验收的公网端口配置仍未完成,不计入本轮通过项。
## 正式恢复入口未通过
2026-09-18 15:31 浏览器点击登录页的“忘记密码?”后,`https://mail.example.com/public-password-recovery` 返回 404;服务器通过本机地址及正确域名验证同样返回 404,`https://mail.example.com/rest/` 也返回 404。直接访问内部 HTTPS 8002 端口时入口返回 302,跳转地址为 `https://mail.example.com:8002/rest/`。因此不能将隔离环境的恢复入口验收结果视为正式环境通过。
正式配置代次为 2,HTTP 8001、HTTPS 8002、`tlsMode=direct`,缺少 `http.publicHttpsPort`。当前实现依据受控配置确定公网端口,缺省使用内部 HTTPS 端口,导致公网请求与恢复入口的域名端口校验不匹配。所需修改是通过正式配置流程设置 `http.publicHttpsPort=443`,保留内部监听端口和 `direct` 模式;当前 Nginx 使用 HTTPS 8002 上游,不应为解决此问题切换 TLS 模式。
项目现有 `smail-config` 仅提供迁移,`smail-admin` 仅提供诊断及受保护重置,没有公网端口修改命令。本轮没有修改配置文件或重置管理员密码,需要有效的网页管理员会话继续。修改后须通过浏览器验证入口跳转到不含 8002 的 `/rest/`、恢复页面资源加载及返回登录链接;真实邮件与改密闭环仍需单独验收。
## 服务器清理后的边界
2026-09-18 已停止并移除外部 `smail-certificate-renew` 服务与定时器、独立 Python 续期程序和 lego 工具。原数据与清理证据位于受保护目录 `/var/backups/smail-cleanup-20260918-bwQalZ`。这部分是此前清理结果,不代表本次真实 CA 续期验收。
仓库旧续期文档中的脚本与 timer 描述属于历史过程,不再是当前部署要求。当前手动证书保持不自动续期;尚未以真实 CA 完成项目自托管的生产续期,不将策略测试等同于真实换证成功。
## 2026-09-18 15:56 起生产状态复核
- [✓] 使用当前授权的 SSH 连接检查 47 主机,Smail、Nginx 均为 active。Smail 自 15:24:03 启动,PID 605706,自动重启次数为 0,控制组 OOM 与 OOM kill 均为 0。
- [✓] 线上主程序 SHA-256 仍为 `56d426732dbf3596ad943ac6ed65b5b504101b05f82855d0e89368ce01bfeee8`。本轮打包流程变更未部署到服务器,不能把本地包视为线上版本。
- [✓] 从服务器经正式域名和本机地址检查 HTTPS 首页,返回 200;443、465、993、995 均通过主机名及系统信任链验证,TLS 1.3。外部续期 timer 文件不存在,systemd 定时器列表未发现 Smail 或 Certbot 续期任务。
- [✓] MCP 浏览器打开正式站点,显示中文登录表单;当前没有已登录的管理员会话。该页面证据不代表登录后业务验收。
- [!] `/public-password-recovery`、`/rest/` 仍返回 404。直接访问内部 HTTPS 8002 的恢复入口返回 302,目标为 `https://mail.example.com:8002/rest/`。只读取必要配置字段确认代次 2,HTTP 8001、HTTPS 8002、`tlsMode=direct`,未设置 `publicHttpsPort`。
- [!] 继续通过正式配置界面设置公网 HTTPS 端口 443,需要有效的 Smail 网页管理员登录;本轮未重置管理员、编辑配置或数据库,未发送恢复邮件。SSH 用户名与密码不能推定为网页邮箱凭据。
本机 curl 的 Schannel 握手失败,但服务器端可信 TLS 验证与浏览器页面访问成功,因此没有将本机 curl 的失败归因于线上证书故障。生产业务测试仍未完成,真实 CA 自动续期、登录后的证书模式切换、恢复与撤销闭环继续待验收。本轮仅只读复核,没有清库、上传测试工具或添加运行脚本。
## 2026-09-18 16:35 起登录和公网恢复入口修复
- [✓] 已通过项目受保护本机通道恢复现有 `admin` 登录,并验证收件箱及刷新后的会话。正式数据库不存在反馈中的 `xuans`,具体诊断与备份见《密码恢复实机验收》。
- [✓] 已通过正式配置页面设置公网 HTTPS 端口 443,候选配置应用成功,磁盘配置代次为 3。内部 8001/8002 和 TLS 模式保持原值。
- [✓] 公网恢复入口 302 至不含 8002 的 `/rest/`,浏览器恢复表单及返回登录正常。此前网页管理员会话和恢复入口 404 两项阻塞已解除。
上述结果不覆盖真实 CA 续期、证书模式切换和外部邮箱恢复闭环;这些项目仍须独立验收。