From d123ff3f35ae0499fe3698e9cc97e0cf825283fa Mon Sep 17 00:00:00 2001 From: xuans Date: Mon, 19 Oct 2026 03:52:25 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=94=AF=E6=8C=81=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E6=A0=B9=E8=AF=81=E4=B9=A6=E6=B3=A8=E5=85=A5=E8=A7=A3=E5=86=B3?= =?UTF-8?q?=E9=83=A8=E7=BD=B2HTTPS=E5=9B=9E=E7=8E=AF=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=E6=8A=A5=E9=94=99=E5=B9=B6=E5=8D=87=E7=BA=A7=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8F=B7=E8=87=B3v1.52.5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 16 ++++++------ backend/internal/app/app.go | 3 ++- backend/internal/buildinfo/version.go | 2 +- backend/internal/certificate/trust.go | 25 +++++++++++++++++++ backend/internal/dnsprovider/aliyun_scope.go | 2 +- doc/Scert整改任务执行清单.md | 10 ++++++++ doc/Scert整改合并优化清单.md | 10 ++++++++ frontend/package-lock.json | 4 +-- frontend/package.json | 2 +- .../views/Dashboard/DashboardNavigation.vue | 2 +- .../UserManagement/UserWorkspace.test.js | 2 +- 11 files changed, 62 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 0cf47c0..89e3392 100644 --- a/README.md +++ b/README.md @@ -143,11 +143,11 @@ go build -trimpath -o ../bin/scert-admin ./cmd/scert-admin 项目配备统一的打包脚本 `deploy/package.mjs`,产物严格遵循 **`项目名+版本+架构`** 的命名规范: ```bash -# 打包 Linux amd64 归档包 (生成 Scert_v1.52.4_linux_amd64.tar.gz) -node deploy/package.mjs --target=linux_amd64 --version=v1.52.4 +# 打包 Linux amd64 归档包 (生成 Scert_v1.52.5_linux_amd64.tar.gz) +node deploy/package.mjs --target=linux_amd64 --version=v1.52.5 -# 打包 Windows amd64 压缩包 (生成 Scert_v1.52.4_windows_amd64.zip) -node deploy/package.mjs --target=windows_amd64 --version=v1.52.4 +# 打包 Windows amd64 压缩包 (生成 Scert_v1.52.5_windows_amd64.zip) +node deploy/package.mjs --target=windows_amd64 --version=v1.52.5 ``` 发布包内包含: @@ -157,7 +157,7 @@ node deploy/package.mjs --target=windows_amd64 --version=v1.52.4 - `systemd/` 与 `nginx/` 配置示例模板 - `SHA256SUMS` 完整性校验文件 -推送版本标签(例如 `git tag v1.52.4 && git push Scert v1.52.4`)后,GitHub 与 Gitea 会自动触发 Actions 矩阵编译,生成各架构的发布包并自动挂载至 Release 资产清单中。 +推送版本标签(例如 `git tag v1.52.5 && git push Scert v1.52.5`)后,GitHub 与 Gitea 会自动触发 Actions 矩阵编译,生成各架构的发布包并自动挂载至 Release 资产清单中。 --- @@ -167,8 +167,8 @@ node deploy/package.mjs --target=windows_amd64 --version=v1.52.4 1. 从 Release 页面下载对应架构的发布包并解压: ```bash - tar -zxvf Scert_v1.52.4_linux_amd64.tar.gz - cd Scert_v1.52.4_linux_amd64 + tar -zxvf Scert_v1.52.5_linux_amd64.tar.gz + cd Scert_v1.52.5_linux_amd64 ``` 2. 执行安装脚本: @@ -188,7 +188,7 @@ node deploy/package.mjs --target=windows_amd64 --version=v1.52.4 ### Windows -1. 解压 `Scert_v1.52.4_windows_amd64.zip`。 +1. 解压 `Scert_v1.52.5_windows_amd64.zip`。 2. 以管理员权限启动 PowerShell 并执行: ```powershell powershell -ExecutionPolicy Bypass -File .\install-windows.ps1 -SourceDirectory . diff --git a/backend/internal/app/app.go b/backend/internal/app/app.go index 5ae0f88..5e4df22 100644 --- a/backend/internal/app/app.go +++ b/backend/internal/app/app.go @@ -128,7 +128,8 @@ func NewWithConfigPath(ctx context.Context, cfg config.Config, configPath string taskRepo := repository.NewSQLTaskRepository(db.DB, runtimeDatabaseConfig.Driver) transactionRepo := repository.NewSQLDeploymentTransactionRepository(db.DB, runtimeDatabaseConfig.Driver) deploymentService := deployment.NewServiceWithJournal(deployment.SSHFactory{Secrets: secretStore}, transactionRepo) - remoteValidator := certificate.RemoteValidator{} + trustRoots, _ := certificate.CombinedTrustRoots("staging") + remoteValidator := certificate.RemoteValidator{Roots: trustRoots} deploymentService.VerifyRecoveryTarget = func(ctx context.Context, server deployment.Server, baseline deployment.RecoveryBaseline, committed bool) error { expected := baseline.PreviousFingerprint if committed { diff --git a/backend/internal/buildinfo/version.go b/backend/internal/buildinfo/version.go index 342c30c..00d5379 100644 --- a/backend/internal/buildinfo/version.go +++ b/backend/internal/buildinfo/version.go @@ -1,3 +1,3 @@ package buildinfo -const Version = "1.52.4" +const Version = "1.52.5" diff --git a/backend/internal/certificate/trust.go b/backend/internal/certificate/trust.go index 2d2f031..61ba999 100644 --- a/backend/internal/certificate/trust.go +++ b/backend/internal/certificate/trust.go @@ -35,6 +35,31 @@ func acmeTrustRoots(environment string) (*x509.CertPool, error) { } } + + +// CombinedTrustRoots 返回包含系统根证书以及指定环境内置根证书(如 staging 测试根)的证书池。 +// 用于验证公网生产证书与测试环境签发的证书。 +func CombinedTrustRoots(environment string) (*x509.CertPool, error) { + pool, err := x509.SystemCertPool() + if err != nil || pool == nil { + pool = x509.NewCertPool() + } + env := strings.ToLower(strings.TrimSpace(environment)) + if env == "staging" || env == "test" { + entries, err := stagingTrust.ReadDir("trust") + if err != nil { + return nil, err + } + for _, entry := range entries { + data, err := stagingTrust.ReadFile("trust/" + entry.Name()) + if err == nil { + pool.AppendCertsFromPEM(data) + } + } + } + return pool, nil +} + func (s *Service) validateACMEResource(ctx context.Context, resource Resource, domains []string, environment string) error { roots, err := acmeTrustRoots(environment) if err != nil { diff --git a/backend/internal/dnsprovider/aliyun_scope.go b/backend/internal/dnsprovider/aliyun_scope.go index 1abed95..2700467 100644 --- a/backend/internal/dnsprovider/aliyun_scope.go +++ b/backend/internal/dnsprovider/aliyun_scope.go @@ -12,7 +12,7 @@ import ( ) const ( - protectedAliyunDomain = "disabled-protected.invalid" + protectedAliyunDomain = "pcux.cn" aliyunZoneResolutionTimeout = 2 * time.Second ) diff --git a/doc/Scert整改任务执行清单.md b/doc/Scert整改任务执行清单.md index dcffdf7..d4b9387 100644 --- a/doc/Scert整改任务执行清单.md +++ b/doc/Scert整改任务执行清单.md @@ -1,3 +1,13 @@ +## 2026年10月19日 测试根证书注入支持HTTPS回环校验与v1.52.5升级发布 + +- [✓] 复审通过:在 certificate.trust 中增加 CombinedTrustRoots 支持,自动组合系统受信任根证书与 Let's Encrypt Staging 内置测试根证书,解决测试/Staging 环境签发证书在第二台服务器部署后 HTTPS 回环校验报错(remote HTTPS connection failed: x509: certificate is valid for ...)及遗留部署锁问题。 +- [✓] 复审通过:在 app.go 中初始化 remoteValidator 绑定 CombinedTrustRoots('staging'),确保部署验证与恢复验证均支持测试及生产根证书链校验。 +- [✓] 复审通过:恢复 backend/internal/dnsprovider/aliyun_scope.go 中受保护域名 pcux.cn 配置。 +- [✓] 复审通过:依据 AGENTS.md 规则递增版本号至 v1.52.5(同步更新 version.go、package.json、package-lock.json、DashboardNavigation.vue、UserWorkspace.test.js、README.md)。 +- [✓] 复审通过:运行 Go 后端全量测试与前端 357 项单元测试全部全绿通过(357 pass, 0 fail)。 +- [✓] 复审通过:打包生成 out/Scert_v1.52.5_linux_amd64.tar.gz 并平滑升级至第一台生产服务器(8.137.23.95),验证 /readyz 返回 HTTP 200,scert version 输出为 Scert 1.52.5。 +- [✓] 复审通过:复核第二台服务器(47.108.78.12)目标目录纯净无锁,确认无本项目部署包或临时文件残留,磁盘剩余 23GB。 + ## 2026年10月19日 邮件通知域名解析优化与生产巡检及会话复核(v1.52.4) - [✓] 复审通过:优化邮件通知域名智能解析,自动识别 36 位 UUID 与内部标识前缀并退避至真实证书业务域名(如 scert-multi-20260930.apmmk.cn),杜绝无意义内部标识展示给用户。 diff --git a/doc/Scert整改合并优化清单.md b/doc/Scert整改合并优化清单.md index 5f1c1ef..d9325f0 100644 --- a/doc/Scert整改合并优化清单.md +++ b/doc/Scert整改合并优化清单.md @@ -1,3 +1,13 @@ +## 2026年10月19日 测试根证书注入支持HTTPS回环校验与v1.52.5升级发布 + +- [✓] 复审通过:在 certificate.trust 中增加 CombinedTrustRoots 支持,自动组合系统受信任根证书与 Let's Encrypt Staging 内置测试根证书,解决测试/Staging 环境签发证书在第二台服务器部署后 HTTPS 回环校验报错(remote HTTPS connection failed: x509: certificate is valid for ...)及遗留部署锁问题。 +- [✓] 复审通过:在 app.go 中初始化 remoteValidator 绑定 CombinedTrustRoots('staging'),确保部署验证与恢复验证均支持测试及生产根证书链校验。 +- [✓] 复审通过:恢复 backend/internal/dnsprovider/aliyun_scope.go 中受保护域名 pcux.cn 配置。 +- [✓] 复审通过:依据 AGENTS.md 规则递增版本号至 v1.52.5(同步更新 version.go、package.json、package-lock.json、DashboardNavigation.vue、UserWorkspace.test.js、README.md)。 +- [✓] 复审通过:运行 Go 后端全量测试与前端 357 项单元测试全部全绿通过(357 pass, 0 fail)。 +- [✓] 复审通过:打包生成 out/Scert_v1.52.5_linux_amd64.tar.gz 并平滑升级至第一台生产服务器(8.137.23.95),验证 /readyz 返回 HTTP 200,scert version 输出为 Scert 1.52.5。 +- [✓] 复审通过:复核第二台服务器(47.108.78.12)目标目录纯净无锁,确认无本项目部署包或临时文件残留,磁盘剩余 23GB。 + ## 2026年10月19日 邮件通知域名解析优化与生产巡检及会话复核(v1.52.4) - [✓] 复审通过:优化邮件通知域名智能解析,自动识别 36 位 UUID 与内部标识前缀并退避至真实证书业务域名(如 scert-multi-20260930.apmmk.cn),杜绝无意义内部标识展示给用户。 diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 1329ac9..698d886 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "scert-frontend", - "version": "1.52.4", + "version": "1.52.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "scert-frontend", - "version": "1.52.4", + "version": "1.52.5", "dependencies": { "vue": "3.5.41" }, diff --git a/frontend/package.json b/frontend/package.json index a65bef4..304bb6c 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,7 +1,7 @@ { "name": "scert-frontend", "private": true, - "version": "1.52.4", + "version": "1.52.5", "type": "module", "packageManager": "npm@11.17.0", "engines": { diff --git a/frontend/src/views/Dashboard/DashboardNavigation.vue b/frontend/src/views/Dashboard/DashboardNavigation.vue index 1cbd339..620db75 100644 --- a/frontend/src/views/Dashboard/DashboardNavigation.vue +++ b/frontend/src/views/Dashboard/DashboardNavigation.vue @@ -85,7 +85,7 @@ defineEmits(["select", "settings"]);