Skip to content

TOOL_SECRET_KEY 不再回退到开发密钥,缺了和 CREDENTIALS_KEY 一样拒绝启动 (#23) - #87

Merged
joesmart merged 3 commits into
mainfrom
joesmart/sec-tool-secret-key
Oct 23, 2026
Merged

joesmart merged 3 commits into
mainfrom
joesmart/sec-tool-secret-key

Conversation

@joesmart

Copy link
Copy Markdown
Contributor

改了什么

  • TOOL_SECRET_KEY 去掉写死在仓库里的开发默认值。没设或留空时控制面启动直接报错退出,报错为「TOOL_SECRET_KEY 没设,用 openssl rand -hex 32 生成一个」,和 CREDENTIALS_KEY 一样。
  • 所有起控制面的地方都补上这把钥匙,和 CREDENTIALS_KEY 的做法一致:e2e 真栈(packages/e2e/src/stack.ts)和桌面验收脚本(packages/desktop/scripts/prove.ts)每次随机生成一把;verify 的 stack.sh 在 shell 和 .env 都没有时生成一把,存进 .audit/verify-run/tool-secret.key 复用;控制面测试里还没显式传 toolSecretKey 的 5 个文件补传。
  • 文档:.env.example 把 TOOL_SECRET_KEY= 从注释改为必填行;docs/开发.md 的变量表改为「无,必填」,「跑起来」一节加上生成两把钥匙的说明;packages/control-plane/README.md、deploy/README.md、verify skill 同步修改。

为什么这么改

issue 的建议方向是「非开发环境缺失即拒绝启动」,但仓库里没有区分开发和生产的判据:没有 NODE_ENV,也没有别的开关。现成的先例是 CREDENTIALS_KEY,它在任何环境都必填,测试和 e2e 自己生成,开发靠 .env 提供。这次让 TOOL_SECRET_KEY 照同样的方式处理,两把钥匙的行为一致。

没有新加一个「生产模式」开关再只在生产下拦截,理由有两个:

  1. 要靠这个开关拦截,生产部署就得记得把它设上。忘设开关和忘设钥匙是同一类漏配,到头来部署还是会带着人人都知道的那把钥匙照常起来,问题没有解决。
  2. 写在仓库里的钥匙,用来加密等于没加密。开发环境也不该让它出现在任何库里。

升级须知

  • 本地已有的 .env 需要加一行 TOOL_SECRET_KEY=$(openssl rand -hex 32),否则 pnpm dev 起不来,报错会点名这个变量。
  • 本地开发库里已经存了工具连接的,这些凭据是用旧开发密钥加密的,换成新钥匙后解不开。可以把 TOOL_SECRET_KEY 设成旧值继续用(旧值见本 PR 删掉的 DEV_TOOL_SECRET_KEY),也可以删掉这些连接重建。
  • deploy/remote/docker-compose.yml 原来就用 :? 要求这个变量,生产部署不受影响。

不在范围

多钥解密和密钥轮换(issue 里的「后续」)不在这个 PR 里。两把钥匙仍然只支持 v1: 单钥。

怎么验证的

  • 新用例 packages/control-plane/test/start-keys.test.ts:用 tsx 起真实的 src/main.ts,缺 TOOL_SECRET_KEY、留空,以及缺 CREDENTIALS_KEY 时,进程都以 exit 1 退出,stderr 点名变量。在修复前的 env.ts 上跑,第一条是红的(stderr 里是「工具认证信息用开发密钥加密」的告警,进程最后死在连库上);修复后为绿。
  • pnpm format:check && pnpm typecheck && pnpm lint:全部通过。
  • pnpm --filter @baize/control-plane test:Test Files 118 passed | 1 skipped,Tests 1532 passed | 1 skipped。第一次跑有 1 条「等控制面下发报文超时」偶发失败,重跑全绿。
  • pnpm --filter @baize/e2e test:Test Files 26 passed,Tests 53 passed。
  • pnpm --filter @baize/desktop test:Test Files 8 passed,Tests 121 passed。
  • 用真实的 node scripts/dev.mjs 起了一次(docker 换成空壳,避免碰共用的 Postgres 容器;连临时库,端口 3462/5462)。带钥匙时控制面打出「控制面在 http://localhost:3462」,`/api/me` 返回 401,Web 返回 200;把 TOOL_SECRET_KEY 置空后,控制面报「TOOL_SECRET_KEY 没设,用 openssl rand -hex 32 生成一个」。

Closes #23

🤖 Generated with Claude Code

https://claude.ai/code/session_01Be3SZps2JjqvyrJ1vbLmni

joesmart and others added 3 commits October 23, 2026 22:24
#85 把单实例锁放在启动最前面,缺 TOOL_SECRET_KEY 时会先撞上连库失败,报错不再点名缺的变量。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Be3SZps2JjqvyrJ1vbLmni
@joesmart
joesmart force-pushed the joesmart/sec-tool-secret-key branch from cf40b3c to e5cbd1f Compare October 23, 2026 14:32
@joesmart
joesmart merged commit ae156be into main Oct 23, 2026
1 check passed
@joesmart
joesmart deleted the joesmart/sec-tool-secret-key branch October 23, 2026 14:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

TOOL_SECRET_KEY 未设置时悄悄回退到仓库内写死的开发密钥

1 participant