参考
SecretRefs 和运行时快照应该怎么理解
基于最新官方 Secrets Management 文档,解释 env/file/exec secret refs 的解析时机、活动面、失败模式和热重载语义,避免把密钥管理误解成“请求时临时去取”。
AI 摘要
这页重点
基于最新官方 Secrets Management 文档,解释 env/file/exec secret refs 的解析时机、活动面、失败模式和热重载语义,避免把密钥管理误解成“请求时临时去取”。
参考
secrets / secretrefs / runtime / providers / reference
最后更新 2026-03-22,来源 OpenClaw Docs
SecretRefs 和运行时快照应该怎么理解
OpenClaw 最近把 Secrets Management 单独做成一页,非常值。
因为它解决的不是“密钥写在哪更优雅”,而是:
- 凭据到底什么时候解析
- 解析失败时系统怎么反应
- 运行时会不会在热路径里依赖外部 secret provider
这几个问题一旦搞错,后面排障会非常混乱。
先记住最重要的一句
官方当前文档写得很清楚:
- Secret refs 会在激活时 eagerly resolve
- 运行时请求读的是内存里的 active snapshot
也就是说,它不是:
- 每次请求到了再去现查 secret
而是:
- 激活时先把所有引用解析完
- 成功后生成一份可用快照
这套模型在保护什么
它主要在保护两件事:
1. 热路径稳定性
如果每次模型请求、provider 请求或渠道动作都临时去查外部 secret provider,运行时会很容易被:
- provider 抖动
- 文件读取异常
- 外部命令失败
拖慢甚至拖挂。
官方现在这套设计,就是把这些风险尽量前移到激活期。
2. 配置切换原子性
官方还明确写到:
- reload 用的是 atomic swap
- 要么整套新快照成功,要么继续保留 last-known-good
这意味着:
- 新凭据没准备好时,不会半新半旧地把系统切进不一致状态
现在支持哪些 secret refs
官方当前文档里主要讲的是几类来源:
- env refs
- provider refs,例如
file或exec
它们的共同点是:
- 配置里只存引用
- 真正的值在激活时统一解析
所以它们是:
- 配置表达层
不是:
- 运行时 API 调用协议
onboarding 的 preflight 在做什么
官方最近一个很值的细节是:
- interactive onboarding 选 secret refs 时,会先做 fast preflight
它会检查:
- env var 名称是否合法且当前可见
- provider/id 是否真能解析到值
这件事的意义不是用户体验小优化,而是:
- 在落盘前先确认引用不会马上坏掉
为什么“明文也能用”反而值得记住
官方文档明确写了:
- plaintext 依然可以工作
- secret refs 是 optional
这意味着 secret refs 不是强制宗教,而是为了让你在:
- 配置文件可分享
- 凭据需要轮换
- 团队环境有统一 secret provider
这些场景里更容易管理。
失败时系统会怎么表现
根据官方当前文档,更值得这样理解:
- 激活时解析失败,启动会 fail fast
- reload 失败,不会污染当前活动快照
这条边界非常重要,因为它说明:
- “新配置坏了”不等于“当前运行立刻半残”
反而更像:
- 新快照不上线
- 老快照继续服务
这和“请求时临时拉密钥”有什么区别
差别非常大。
当前官方模型
- 激活时统一解析
- 请求时只读内存快照
很多人以为的模型
- 每次请求现拉密钥
如果你按第二种去理解,就会误判很多问题,例如:
- 为什么 secret provider 短时抖动,系统却没马上挂
- 为什么 reload 失败但当前调用还能继续
哪些场景特别适合 secret refs
更适合的通常是:
- 团队或企业环境
- 多 provider 凭据并存
- 需要轮换 API key / token
- 不想把秘密直接提交进配置仓库
个人最小环境里,明文或 env 也能跑;但只要环境开始复杂,secret refs 的价值就会迅速上升。
中文用户最容易踩的坑
1. 以为 secret refs 是运行时 fallback
它不是。解析失败时更像配置激活失败。
2. 以为 provider 暂时不可用,线上请求就一定马上全挂
当前模型下,已经激活的 active snapshot 仍然可能继续服务。
3. 以为 reload 一半成功也会部分生效
官方明确做的是 atomic swap,不是半更新。
一条更稳的使用路径
建议按这个顺序来:
- 先把 provider / 渠道配置跑通
- 再把明文凭据替换成 env 或 provider refs
- 确认激活和 reload 都能成功
- 最后再把 secret rotation 纳入日常运维节奏