75 lines
8.6 KiB
Markdown
75 lines
8.6 KiB
Markdown
# 证书托管续期策略验收
|
||
|
||
## 确认的需求
|
||
|
||
- 项目自身托管:使用项目内置 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.solit.cn/public-password-recovery` 返回 404;服务器通过本机地址及正确域名验证同样返回 404,`https://mail.solit.cn/rest/` 也返回 404。直接访问内部 HTTPS 8002 端口时入口返回 302,跳转地址为 `https://mail.solit.cn: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.solit.cn: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 续期、证书模式切换和外部邮箱恢复闭环;这些项目仍须独立验收。
|