From 94c674d8055756be4399e7d4f484534ddc0ba412 Mon Sep 17 00:00:00 2001 From: xuans Date: Thu, 1 Oct 2026 22:28:53 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=B8=8D=E5=90=8C=E8=AF=81?= =?UTF-8?q?=E4=B9=A6=E4=B8=AD=E6=96=AD=E6=81=A2=E5=A4=8D=E4=B8=8E=E5=A4=9A?= =?UTF-8?q?=E7=9B=AE=E6=A0=87=E5=9B=9E=E6=BB=9A=E5=AE=9E=E6=9C=BA=E9=AA=8C?= =?UTF-8?q?=E6=94=B6=E8=BF=9B=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/Linux生产流程测试记录.md | 77 ++++++++++++++++++++++++++++ doc/Scert整改任务执行清单.md | 15 ++++++ doc/Scert整改合并优化清单.md | 14 +++++ 3 files changed, 106 insertions(+) diff --git a/doc/Linux生产流程测试记录.md b/doc/Linux生产流程测试记录.md index 802df58..50c60e2 100644 --- a/doc/Linux生产流程测试记录.md +++ b/doc/Linux生产流程测试记录.md @@ -1,5 +1,82 @@ # Linux 生产流程测试记录 +## 不同证书进程中断恢复与多目标部分失败(2026-10-01 22:22,北京时间) + +### 范围与已确认需求 + +沿用原清单,仅推进 Linux。使用两台现有测试服务器及 scert-multi-20260930.apmmk.cn,保留数据库执行连续负向回归,不计作最终清库首次验收。人工连接使用密码 SSH/SCP 和已有主机身份校验;产品继续使用其托管 SSH 身份。未新增 ACME 签发、未手工改任务状态或删除锁、未建立辅助验收脚本、未额外制作业务备份。 + +本轮任务:核对正式复用入口、真实不同证书进程中断、修复发现的问题、正式构建及双机安装、原任务重试、不同证书多目标部分失败、恢复标准配置和安全复核。以下均为实际执行结果,不用同证书测试替代不同证书证据。 + +### 证书及准备 + +- 运行基线为较新的有效证书,叶指纹 `9D866F8360FB65365A766BF53DC087E91254FC3CC6137F9DEF25E39FA253C742`。 +- 复用的另一张有效证书叶指纹 `43063C0726D34362B254CE28B66D7EB637E00B165F68EC0D07FCED0DF2C64AD2`,来源为产品已有备份目录 `/scert/backups/scert-multi-20260930.apmmk.cn/20261001-132352.396840332`。 +- 当前正式历史接口只保留当前版本,历史恢复已停用;因此使用正式证书路径导入接口,不改证书目录或数据库来切换版本。 +- 临时通过正式服务器接口将双机配置校验命令设为 /bin/false,导入旧证书保存为 20261001-V1.1。接口返回 502、imported=true、双机 validation_failed;两事务均 rolled_back、reload_attempted=0。任务 `a62dca21-d667-421b-beed-ffd667d9ebc6` 保持失败,双机文件与实际 TLS 均保持较新证书,无本次锁。 +- 导入自动保留的较新证书位于 `/scert/backups/scert-multi-20260930.apmmk.cn/20261001-135641.353585470`,核对指纹正确。 +- 校验命令随后恢复 nginx -t;仅第一台临时使用有条件的重载等待:正常 nginx 重载后,只有目标文件为旧证书摘要时等待 45 秒。恢复到基线证书时不等待;没有创建脚本文件。 + +### 旧候选真实复现 + +- 源码候选 2e6d992,正式部署任务 `3517c6d2-095a-419c-a2bc-268bb3c3eab8`,第一次尝试 `831008dc-2f8e-4b18-8b6d-04a41b8a0081`。 +- UTC 13:59:34 两事务均 reload_attempted/pending,第二台实际 TLS 已变为旧证书指纹;13:59:47 第一台也实际提供旧证书,受控等待进程仍在运行。 +- UTC 14:00:02 再次验证两个事务仍在预期阶段后,对第二台主进程 PID 173940 发送 SIGKILL。systemd 启动 PID 174649,NRestarts 从 0 变为 1。浏览器原请求返回 Nginx 502,未伪报成功。 +- 文件和运行证书已恢复较新基线,但两事务留下 recovery_required,错误为恢复站点指纹不符;本次锁被保留。 +- 两事务:`20261001-135920.017620191-f547126af33a`、`20261001-135922.655846921-a98fb068e5f4`。 +- 只读核对事务的 previous_fingerprint 正是较新证书,expected_fingerprint 是待部署旧证书,证明不是记录了错误基线。 +- 根因:启动恢复重载后仅立即核验一次,而正常部署已有有限次等待;不同证书实际切换尚未完成时,单次结果导致安全留锁。本问题是恢复误判,不是放宽校验或假成功。 + +### 修复、测试及正式安装 + +- 检查点 adbb398 已提交推送;修复提交 `00aeedc3efe9507b0fa04bcc1269755b3f599499` 已推送。 +- 修改 app.go 的启动恢复核验,新增 recovery_verification.go,复用正常部署六次、间隔 500 毫秒的严格 HTTPS 指纹核验,支持上下文取消和截止时间;持续不符或校验失败继续返回失败并保留现场。 +- recovery_verification_test.go 覆盖真实受信 TLS 的回滚/提交两种不同证书切换,以及持续指纹不符、空指纹、校验错误、取消后匹配、截止时间共五种失败保护。单次核验实现不能通过新增专项,有限次核验后专项通过。 +- 后端 go test ./...、go vet ./...、go build ./... 通过;前端 npm test 241 项全部通过;正式前端构建、发布路径检查及差异检查通过。本轮未运行竞态测试,不把条件跳过的数据库场景算作实库验收。 +- 正式入口 build/build-release.ps1 -Target linux-amd64,产物 `build/release-20261001-startup-verification/Scert-20261001-V0.1.0-linux-amd64.tar.gz`,source_dirty=false。 +- 归档 SHA-256:`e3aaf5caf54bab6b26cbd43907a4cdcc12b95cf130fd5ba74eb8b6b3f23eb2bc`。 +- 主程序 SHA-256:`04f873c7fbec900f50ac17db172225a2a882e667755406c8978fcc031ed75cf1`,两台安装后相同。 +- 两台通过密码 SCP 上传,校验归档及包内 SHA256SUMS,停止 Scert 相关服务后运行正式安装器,再启动目录 socket 和主服务。Nginx 及第一台邮件服务未停止,不宣称管理入口升级零中断。 +- 安装器自身保留发布文件:第二台 `/scert/.install-PDtxYNpM`、第一台 `/scert/.install-qbJ9Hdnf`,未删除安装事务或历史文件。 +- UTC 14:10:53,旧候选复现产生的两事务已由新候选启动恢复自动 rolled_back,本次锁自动释放。未靠手工改库/删锁处理。 +- 关闭旧浏览器页面,新建独立 Scert-startup-verification-00aeedc 上下文并通过正式登录页面重新登录,不复用旧缓存。 + +### 修复版真实中断、自动恢复与原任务重试 + +- 对同一任务执行正式重试,第二次尝试 `652ca8d0-e4a7-4e4b-966d-3e79c4b6bdc0`。 +- UTC 14:13:19 两台实际 TLS 均切换到旧证书指纹,两新事务均 reload_attempted/pending,第一台等待进程仍存活。 +- UTC 14:13:33 对第二台主 PID 175047 发送 SIGKILL,随后 systemd 启动 PID 175308,NRestarts=1;原 HTTP 请求返回 502。 +- UTC 14:14:02 两事务已自动 rolled_back,原任务 failed/service_restart,readyz 为 200;第二台文件及实际 TLS 已恢复较新证书。14:14:19 第一台同样确认文件及实际 TLS 恢复,严格 HTTPS 200,无本次锁、临时文件或事务旧文件残留。 +- 两个新事务:`20261001-141302.527037588-1ca22507895f`、`20261001-141306.622429896-38f7ca5e5ce9`。不需要再次人工重启或介入释放锁。 +- 通过正式服务器接口将双机配置均恢复 validation_command=[nginx,-t]、reload_command=[nginx,-s,reload],GET 复核一致。 +- 第三次正式重试同一任务成功,尝试 `0102a206-639d-4bbe-960d-4c1d25609f50`,UTC 14:15:37 完成。HTTP 200、双机成功、verification_status=success;前两次失败记录保留。 +- 成功事务 `20261001-141526.617981312-26d6f26fb817`、`20261001-141529.680082912-7006a376eaf9` 均 committed。双机实际提供所部署旧证书,严格 HTTPS 200;成功后重复重试返回 409。 + +### 不同证书多目标部分失败 + +- 复用前述较新证书备份,通过正式导入保存为 20261001-V1.2,没有再签发证书。 +- 第二台使用标准校验/重载;第一台临时配置校验为等待 15 秒后失败,重载仍为标准命令。 +- 导入任务 `38cd22e1-ceff-43ed-b43d-cec473bd7e8e`。UTC 14:17:44,第二台实际提供较新证书,事务 reload_attempted/pending;第一台仍提供旧证书,其事务 installed/pending、reload_attempted=0,受控校验仍在执行。 +- UTC 14:17:57 接口返回 502、imported=true、部署失败;第二台 failure_code=recovery_restored,第一台 validation_failed,recovery_status=success。不是把部分推送成功当成整体成功。 +- 两事务 `20261001-141727.636335840-f918958bcc2f`、`20261001-141731.015455136-3898de99c378` 均 rolled_back,分别记录已尝试重载和未重载。 +- UTC 14:18:42 双机磁盘与实际 TLS 均为旧证书,目录无本次锁、临时文件和事务旧文件。确认已重载的目标也自动恢复了运行证书。 +- 恢复第一台标准校验命令,GET 复核两台均为标准配置。通过正式部署当前证书而非重新导入/签发,任务 `39af8113-05a7-4075-8700-9fba2ca8608e` 于 UTC 14:19:36 返回 200,双机成功且 verification_status=success。 +- 该任务事务:`20261001-141918.826867221-0ff9674d0969`、`20261001-141921.961222681-692080e5aeca`。 + +### 最终现场、安全边界及剩余门禁 + +- UTC 14:20:23 双机运行最新较新证书,叶指纹为 9D866F8360FB65365A766BF53DC087E91254FC3CC6137F9DEF25E39FA253C742。 +- 双机 cert.pem 和 fullchain.pem SHA-256 为 `7e8b56227b345ed9b66659e428f9bd4421604f11253ab88d65b3ed61737f35cf`;证书和私钥导出的公钥 DER SHA-256 均为 `f71a91f1aaa8c7da7dd945b432520f3a6265d47586c432594091699ccaf0a7de`。未输出私钥。 +- 双机本机 SNI 严格 HTTPS 200,第一台访问第二台公网同域名严格 HTTPS 200,nginx -t 成功,测试域名无本次锁或事务临时文件;活动任务为零。 +- 双机 Scert 8443、MySQL 3306/33060 仅监听 127.0.0.1,双机互探对方公网三个内部端口,六次均退出 124 超时。Nginx 管理反代保持 proxy_ssl_verify on 和正确 SNI,未开放额外公网端口。第一台 xmail.service active。 +- 两台服务器 API 最后 GET 仍为标准 nginx -t / nginx -s reload,故障注入命令已全部撤销。 +- 两条旧历史事务仍 recovery_required,recovery_evidence_json 为 JSON null:20260930-231310.231207974-5bf9d1e37542、20260930-231313.144123222-ce71b1dfe14e。没有补造证据或人工清除。 +- [✓] 本轮不同证书真实进程中断自动恢复、原任务重试/幂等、多目标部分失败回滚及收尾复核通过。 +- [x] 修复代码、测试、正式发行与双机安装完成,等待整体发布复审。 +- [~] 其余负向窗口、锁归属/摘要不匹配实机与历史事务仍待处理,不能据本轮结论将 P0-10 整项标为完成。 +- [!] 系统通知 SMTP 参数及真实发信闭环、第一台测试域名公网平台限制、MySQL 5.7/完整三库 Web 等原清单剩余门禁、最终清库首次验收尚未完成。已有数据库迁移、独立正式 CLI 备份恢复和 Linux 原生构建证据继续有效。 +- [!] 总体 Linux 生产部署验收未放行;Windows 不在本轮范围。 + ## 最新执行记录(2026年10月1日21:43,不同证书重载失败回滚修复) ### 范围、需求及基线 diff --git a/doc/Scert整改任务执行清单.md b/doc/Scert整改任务执行清单.md index 7b97ae7..f1a8426 100644 --- a/doc/Scert整改任务执行清单.md +++ b/doc/Scert整改任务执行清单.md @@ -1,5 +1,20 @@ # Scert 整改任务执行清单 +## 当前有效任务看板(2026年10月1日22:22,启动恢复与多目标负向实证) + +需求确认:不降低 TLS 校验、不手工释放恢复锁、不补造恢复证据;复用已有有效证书,通过正式导入、部署和任务重试执行。本轮不重复签发、不清库、不创建辅助验收脚本。 + +- [✓] T5-6-6 基线与入口:核对双机正式候选、有效新旧证书;确认历史版本恢复接口已停用,使用正式导入入口复用旧证书,未直接改托管文件。 +- [✓] T5-6-6 缺口复现:不同证书切换后真实 SIGKILL;文件及运行证书恢复,但启动恢复仅核验一次而留下指纹不符状态及锁,保留真实失败记录。 +- [x] T5-6-6 开发:`00aeedc` 复用有限次严格 HTTPS 核验,覆盖回滚和提交证书切换、持续不符、空指纹、校验失败、取消及截止时间。后端全量、静态检查、构建、前端 241 项通过。 +- [x] T5-5 正式候选:干净源码 Linux amd64 包完成构建与路径检查,密码 SSH 上传并核验包内摘要,双机通过正式安装器升级,程序哈希一致。 +- [✓] T5-6-6 实机:修复版真实不同证书中断后自动恢复双机文件和运行证书,两个新事务自动回滚,无本次残锁,无人工状态修补。 +- [✓] T5-6-6 重试:同一任务两次失败历史保留,第三次正式重试双机成功;成功后重复请求为 409。 +- [✓] T5-6-7 多目标部分失败:第二台成功重载到新证书、第一台配置校验失败;第二台自动恢复运行证书,第一台未重载且文件回滚,两个事务均 rolled_back。后续恢复标准配置,正式部署当前证书双机成功。 +- [✓] T5-5 安全与收尾:两台配置均恢复 nginx -t 与 nginx -s reload;内部端口回环监听、六次公网跨机探测超时、严格 TLS、证书私钥匹配、邮件服务及无活动任务复核通过。 +- [~] T5-6 其余负向窗口与锁归属/摘要不匹配实机、T5-8 历史缺证据事务仍未闭环。 +- [!] 系统发信闭环、第一台公网平台限制、MySQL 5.7 和完整三库 Web 等剩余门禁、最终清库首次验收未完成;Linux 总体生产验收不放行,Windows 不在本轮范围。 + ## 当前有效任务看板(2026年10月1日21:43,运行证书自动恢复) 需求确认:不允许仅回滚磁盘文件就认定服务恢复;只有重新校验旧配置、重载并核验实际 HTTPS 证书后,才能释放本次锁和标记恢复成功。使用真实不同的新旧证书,保留失败历史;不开放内部公网端口,不关闭 TLS 或 SSH 主机身份校验。 diff --git a/doc/Scert整改合并优化清单.md b/doc/Scert整改合并优化清单.md index f447556..07770a0 100644 --- a/doc/Scert整改合并优化清单.md +++ b/doc/Scert整改合并优化清单.md @@ -1,5 +1,19 @@ # Scert 整改、合并与优化清单 +## 当前有效进度(2026年10月1日22:22,不同证书中断恢复与多目标部分失败) + +本节覆盖下方同项待验证状态;仍按原清单推进 Linux,不处理 Windows。本轮保留数据连续负向回归,不计作最终清库首次验收。需求确认:实际运行证书必须恢复,有限次核验不降低 TLS 校验,证据不足继续保留锁。 + +- [✓] P0-10 中断恢复缺口闭环:不同证书真实 SIGKILL 复现了启动恢复只核验一次、重载尚未生效即误判指纹不符的问题。修复版复用正式部署的有限次、可取消严格 HTTPS 核验;持续不符、校验错误、取消或超时仍失败关闭。 +- [x] 修复与发行:提交 `00aeedc` 已推送,新增恢复核验回归,后端全量测试、静态检查、构建及前端 241 项通过;干净源码正式 Linux 包已通过密码 SSH 和正式安装器部署双机,程序哈希一致。 +- [✓] 不同证书进程中断:修复版中,两台均实际切换到另一张证书后终止第二台主进程,systemd 自动重启;双机自动恢复中断前文件和实际 TLS,事务自动回滚且无本次残锁。旧候选复现留下的本次两事务也由产品启动恢复处理,未手工改库或删锁。 +- [✓] 原任务重试与幂等:原任务 `3517c6d2-095a-419c-a2bc-268bb3c3eab8` 的两次中断失败记录保留,第三次尝试双机成功;成功后重复重试返回 409。 +- [✓] 不同证书多目标部分失败:第二台已提供新证书、第一台配置校验失败后,两台恢复原证书;两个事务均自动回滚。接口如实返回导入成功、部署失败,不误报整体成功。 +- [✓] 收尾:两台已恢复标准 Nginx 校验和重载命令,最新证书通过正式部署接口成功部署;文件、公钥对应摘要、实际 TLS、严格 HTTPS、无本次残锁均复核。内部端口仅回环监听,六次跨机公网探测均超时,第一台邮件服务正常。 +- [~] P0-10 仍非全部完成:其余负向窗口、锁归属或摘要不匹配实机、两条历史缺证据事务继续推进;不能把以上子场景通过扩大为全项通过。 +- [!] 系统通知 SMTP 及真实投递闭环、第一台测试域名公网平台限制、MySQL 5.7 与完整三库 Web 等剩余门禁及最终清库首次验收仍未完成。已完成的数据库迁移、独立正式 CLI 备份恢复和 Linux 原生构建证据继续有效。 +- [!] 总体生产验收未放行。完整任务、事务、时间及产物哈希见《Linux生产流程测试记录》最新章节。 + ## 当前有效进度(2026年10月1日21:43,不同证书重载失败自动恢复) 本节覆盖下方同项待验证状态;本轮是保留数据的 Linux 升级及负向回归,不是最终清库首次验收。需求沿用原清单,不修改历史事务来制造成功,不创建辅助验收脚本。