Smail/docs/云端全项目测试报告.md
smail 418435cb94
Some checks are pending
Security Checks / security (push) Waiting to run
补充云端泛解析与各服务统一证书实测证据
2026-09-20 03:46:00 +08:00

15 KiB
Raw Blame History

云端全项目测试报告

测试日期:2026-09-20,时区 Asia/Shanghai。工作区:D:\Desktop\Smail。服务器:47.108.78.12,页面:https://web.solit.cn/。

结论与任务状态

已完成全项目自动化测试、发现问题的修复、Linux 构建和云端部署,并完成核心账号安全及邮件协议实机验证。当前没有未解决的自动化测试失败,但仍有真实外部邮箱收件、客户端网络路径和无人值守续期等未通过项,不能据此宣布整个项目最终验收通过。

  • [✓] 已按授权备份、清理 Smail 相关环境,重新初始化测试数据库。接续测试复用本轮数据库,没有重复清库。
  • [✓] 修复测试发现的问题,相关包完成复测;最新程序已部署,云端和本地摘要一致。
  • [✓] 三类账号登录、TOTP 选择、提醒行为、邮件验证码跨场景消费、密码重置和客户端凭据撤销完成相应实机验证。
  • [✓] 项目部署包只包含三个程序与四个运行目录,没有加入 Python、部署或续期脚本。
  • [✓] 本轮临时 TOTP、外部邮箱绑定均已停用,账号密码保持用户指定值。
  • [✓] 实时 DNS 控制面、两个权威 DNS 和公共 DNS 均确认泛解析生效;邮件记录保留,DKIM 与运行密钥匹配。
  • [✓] Web 及已启用邮件 TLS、STARTTLS 入口返回同一张覆盖根域名的泛域名证书。
  • [!] 三个指定的 163 邮箱尚未完成真实收件和绑定验证。
  • [!] 当前客户端到公网邮件端口的连接路径未通过,不能声称外网邮件客户端收发通过。
  • [!] DNS 无人值守续期及 Nginx 换证同步未通过。
  • [!] Windows 提权 Named Pipe、依赖外部服务的插件业务等不在本轮 Linux 实机通过范围内。

本轮修复

提交 问题与结果
c82be24 修复全量测试的密码容量竞态,更新与现有行为不一致的审查夹具及前端说明。
b062ca6 项目 DNS 签发同时覆盖主域名及泛域名,保留两条同名 TXT 挑战。
65e61a3 修复真实数据库迁移中对文本主键错误处理序列的问题,校正日志测试。
b515186 公网地址探测支持失败回退,限制并发请求的总等待时间。
7aec99d 密码重置同步撤销旧客户端授权码,补充事务回滚及用户隔离回归。
e0baf27 未认证 POP3 的 QUIT 立即回复并关闭连接,不提交邮箱更新。
310ad01 停用的外部邮箱允许所属用户重新绑定、切换用途;清除旧验证状态并要求重新验证。停用同时失效绑定和变更挑战,保留跨用户隔离及主要邮箱数量限制。

每轮代码修改前均保存中文 Git 基线并推送。一次文档基线推送出现认证失败,重试后成功。没有使用宽泛暂存或提交测试凭据。

自动化测试证据

云端原始日志根目录:/var/tmp/smail-cloud-tests-20260920/。

范围 结果 证据
Linux 后端 66 个包的最新有效结果无失败,1953 个 PASS 标记、0 个 FAIL 标记、5 个 SKIP 标记 latest-summary.json、latest-packages.json
前端 198 项通过,0 失败、0 跳过 本地 test-log/run-2026-09-19T17-30-34-658Z-19808/frontend.log
Windows 构建互斥与测试入口 4 项通过;Linux 专用项在 Windows 跳过 本地 test-log/run-2026-09-19T16-13-15-667Z-3920/deployment.log
Linux 资源策略 15 项通过 云端 resource-policy.log
实际服务资源只读预检 通过,无失败项;不替代业务验收 云端 final-resource-check.json
最后一次修改的本地受影响包 externalemail、controllers、recovery、verification 均通过 本地 test-log/run-2026-09-19T19-10-20-850Z-26796/backend.log
最后一次修改的 Linux 复测 externalemail、controllers 均 EXIT=0 云端 rebind/externalemail.log、rebind/controllers.log

后端统计由首轮全量测试与受影响包的最新复测合并,不是同一最新版一次执行的全量结果。PASS 标记包含父测试和子测试,不能表述为 1953 个独立案例。首轮发现的 adminreset、dbmigration、logstore 等失败已用后续有效复测替换;具体映射保存在 latest-packages.json。

五个后端跳过项:

  1. TestProductionPluginIsolationPolicy:Windows 专用。
  2. TestSecuritySetupBrowserFixture:需要显式启用的长期浏览器夹具。
  3. TestSystemdResultPrompt:需要隔离的 systemd 人工交互。
  4. TestSystemdCancelledInputResult:同上。
  5. TestMaster:旧集成入口,需显式启用,不能直接指向运行库。

本轮另行完成真实 smail-admin 启动、安全验证、成功提示及 stop 取消操作;自动化跳过项仍按跳过记录。Windows 未提权环境未完成 Named Pipe 验收,不列为通过。

云端业务验证

账号与登录

  • xuans 为超级管理员,testadmin 为管理员,testuser 为普通用户。最终均保留用户指定密码;本文不记录密码、验证码、恢复令牌或 TOTP 密钥。
  • 未配置安全验证的超级管理员登录后,页面强制要求至少启用一种方式。最终浏览器重新加载后可见该中文弹窗,没有跳过保护。
  • 普通用户点击“我知道了”后可继续,注销并重新登录会再次提醒未完成的安全设置。
  • 三类账号均具备用户可选的 TOTP 功能。普通用户实测绑定、登录和停用;密码阶段约 473 毫秒、TOTP 验证约 83 毫秒。其他两类账号本轮早期测试完成后也已停用测试 TOTP。
  • 登录密码正确后,有主要外部邮箱的账号返回验证选择,delivery_status=idle,没有自动发邮件;只有主动发送才进入 sending。

邮件验证码与公开密码恢复

使用普通测试用户的真实站内收件箱临时验证管理员,邮件经项目正常投递与邮件 API 读取,没有改数据库伪造验证结果。此闭环证明应用链路,不替代 163 外部收件验收。

步骤 最后一次实测耗时 结果
停用邮箱重新绑定为主要邮箱 3190 毫秒 成功,仍须邮件验证
确认重新绑定 84 毫秒 成功
管理员密码阶段 341 毫秒 返回 email 选择,邮件 idle
主动发送登录验证码 71 毫秒 返回 sending,后台完成真实投递
邮件码完成登录 103 毫秒 成功
立即发起公开恢复 143 毫秒 识别管理员及 email 方式
紧接着发送恢复邮件 2628 毫秒 成功,没有被登录验证码冷却阻塞
邮件码验证恢复身份 74 毫秒 发放一次性重置凭证
设置密码 307 毫秒 重置成功
重置后密码登录 365 毫秒 成功进入验证选择
再次主动发送登录码 89 毫秒 成功

以上为当次单请求观测,不是负载压测或全网延迟保证。公开恢复请求未携带登录 Cookie 或 CSRF 头。测试完成后通过正式接口停用临时邮箱;管理员再次直接登录约 430 毫秒,超级管理员约 307 毫秒。

邮件协议与重置撤销

  • 服务器本机经域名校验的 TLS 完成 SMTP 投递、IMAP 查询读取和 POP3 收取,数据库收件归属核对正常。证据:protocol-acceptance.json。
  • 真实密码重置后,旧客户端授权码在 SMTP、IMAP、POP3 均被拒绝。证据:revoke/live-revocation.json。
  • 未认证、输入 USER 后及错误密码后的 POP3 QUIT 均立即回应并关闭连接;相关包回归通过。证据:revoke/live-pop3-quit.json。
  • 超级管理员登录页恢复通道保持拒绝;本机重置使用受保护 Unix Domain Socket。最终 /run/smail/admin-control.sock 权限为 0600,所属用户/组为 smail,未增加公网重置 TCP 监听。
  • smail-admin 仅显式 start 进入交互,stop 取消;restart、reload 及变体不能开启新的重置交互。systemd 的 restart 仍可能先停止原交互,这一系统行为边界详见《管理员重置命令限制验收》。

证书与网络限制

真实证书签发者为 Let's Encrypt YR1,SAN 为 solit.cn 和 *.solit.cn,有效期从 2026-09-19 16:44:26 UTC 至 2026-12-18 16:44:25 UTC。服务器通过回环和公网地址连接 443、465、993、995,使用实际域名 SNI、系统 CA 进行校验,均通过 TLS 1.3。浏览器 HTTPS 页面可访问。

本机系统 DNS 将三个邮件子域名解析到 198.18.2.x;本机 Python 不论域名连接还是强制公网 IP,连 443 也发生 TLS EOF。现有证据只能说明客户端网络路径未通过,不能归因为云端证书错误,也不能声称公网邮件客户端收发正常。本轮没有修改本机网络设置。

Google 公共 DNS 已查到 DKIM;对 1.1.1.1 的 UDP 查询超时,未计为通过。本轮 ACME TXT 清理仅针对新建的两个记录 ID,核对剩余为零,既有记录保留。

03:32—03:44 补充实测

以下为接续时重新采集的实时证据,不依赖测试参数或历史快照判定通过。云端证据位于 /var/tmp/smail-cloud-tests-20260920/;本地副本位于忽略目录 test-log/cloud-audit-20260920/。

核验项 结果 证据
DNS 控制面 阿里云当前返回 16 条记录,* A 47.108.78.12 已启用 本地 test-log/cloud-dns-current-20260920.json
权威及公共解析 dns13.hichina.com、dns14.hichina.com、8.8.8.8 共 33 次查询均返回 NOERROR;随机一级子域名、Web 和邮件服务地址均指向服务器 live-dns-audit.json
邮件记录保留 MX、SPF、DKIM、DMARC 均可查到;与清理前快照相比,没有删除原有记录,只新增泛解析并更新 Smail 的 default._domainkey 公钥 同上及本地清理前快照
DKIM 密钥匹配 三个 DNS 查询源中的公钥均与 /opt/smail/ssl/dkim/dkim.priv 推导出的公钥一致;只比较公开材料,不输出私钥 live-dkim-match.json
运行域名 邮件主域名为 solit.cn,后台为 web.solit.cn,公开 HTTPS 端口为 443;域名来自部署配置 live-domain-configuration.json
统一证书 回环 443、8002、465、993、995,以及服务器经公网 IP 访问 443、465、993、995,全部通过系统信任链校验且指纹一致;443、8002 额外使用根域名 SNI 校验通过 live-certificate-unification.json
STARTTLS 证书 回环 SMTP 25/587、POP3 110 升级为 TLS 1.3,证书指纹与上述入口一致 live-starttls-certificates.json
浏览器状态 实际 HTTPS 页面为安全上下文,/api/ping 两次返回 200,约 314 和 164 毫秒,超级管理员强制安全设置弹窗可见 本地 live-browser-check.json 保存最后一次结果

统一证书 DER SHA-256:f369937771b4b3bd4fc1ea624a8eed30e1451c8bcefdcd1c9c15043a33113018。

DKIM 公钥 DER SHA-256:df9958f7e8c20c7d7f8735bb062f7bd7485bbee3bbd254930d7ae8d68ae6731c。

上述 TLS 连接共 14 次,其中服务器经公网 IP 访问内部 8002 的两次连接超时,不列为通过;回环 8002 校验通过,公开后台仍从 443 访问。本轮没有开放内部端口。IMAP 当前使用 993 隐式 TLS,源码和现行默认端口策略一致;143 未启用,连接被拒绝,没有将其计为 STARTTLS 通过。

本机系统 DNS 此次将 Web 解析到 198.18.1.254,邮件地址仍解析到 198.18.2.x。本机 curl 和经本地 HTTP 代理的 Python TLS 连接仍在握手阶段失败;浏览器 HTTPS 正常。没有因此修改系统 DNS、代理或防火墙,也没有将服务器自身访问公网 IP 等同于外部客户端验收。

另发现既有 aliyun-cn-hangzhou._domainkey 同名 TXT 有两条,其中一条公钥明显截断。该记录属于既有阿里云邮件链路,本轮未删除或修改;Smail 的 default 选择器公钥匹配已单独通过。保留 DNS 记录不代表既有阿里云邮件链路也已验收。

仍未通过的项目

项目托管启用内置续期检查,手动及代理托管不触发 ACME,策略测试已通过。但 DNS 挑战当前仍依赖人工 TXT,Nginx 配置也固定引用具体证书文件,没有自动同步换证引用和重载。无人值守续期仍未完成。服务器没有启用 Smail、Certbot 或 ACME 外部续期 timer,本轮没有新增外部部署或续期脚本。

指定的三个 163 地址尚未完成真实收件及绑定验证,本轮没有向这些外部收件箱发送测试邮件。后续需由各邮箱持有人接收真实验证码,再通过正式绑定流程完成验证。

最新交付与运行状态

源码提交:310ad0136e9794ccb67e2c92aec05e8c66f151ad。运行版本:test-25fa5dcf9844。后续仅文档提交,不改变部署程序。

发布包:out/release/Smail_linux_amd64.tar.gz。文件结构:

smail/
├── smail
├── smail-admin
├── smail-config
├── config/
├── data/
├── log/
└── ssl/
文件 SHA-256
发布包 998a4a13514d0d2b5ef4a2708e1f27790b673af03fa390aa4f527e4f2e4da858
smail ca525d4fe98973fea2cfb496b37b714fb3aad27999bf73f674bfa27f1358c98e
smail-admin 4af8a7c872d75fa48a967377e404815b0f4f7346c8c209cebb880ecb6039966f
smail-config 95372303efd7b16e54c21bc6190f13da7cbcd05faeeeaab12386ece555484bb4

本地构建收据:out/release-receipts/Smail_linux_amd64.json。三个云端文件均与收据一致。前端和内置插件构建完成;编辑器分块大于 500 KB 的既有构建提示仍存在,没有构建失败。

03:15:29 完成最后一次人工安装和启动。Smail PID 为 712357,自动重启次数为 0,Nginx active。HTTPS 返回 200,系统证书验证结果为 0,观测约 60 毫秒。最终两个数据库 integrity_check 均为 ok;启用的 TOTP 数量为 0,未停用的外部邮箱绑定数量为 0。最后一次启动后的 systemd warning 级日志查询无记录。

最后一次部署前备份:/var/backups/smail-full-test-20260920/pre-rebind/,含三个旧程序及配置、数据、证书归档。测试日志和测试二进制保留在 /var/tmp/smail-cloud-tests-20260920/,不属于运行依赖;没有擅自删除这些验收证据。FDM、Scert、Nginx、MySQL 和 PostgreSQL 的其他业务未因最后一次 Smail 更新而停启。

03:40 接续复核时,Smail 仍为 PID 712357,自动重启次数为 0,Smail/Nginx 均 active;从最后一次启动至此的 warning 级 systemd 日志无记录。本机重置 socket 仍为 0600 smail:smail。接续只补充实测与文档,没有重新清库或变更运行程序。

公网恢复入口已通过正式配置流程设置 http.publicHttpsPort=443;/public-password-recovery 跳转到 https://web.solit.cn/rest/,不再暴露内部 8002 端口,恢复页面返回 200。