明文仍然可用。SecretRef 是按凭据可选启用的。
运行时模型
- Secrets 在激活期间主动解析为内存中的运行时快照,而不是在请求路径上延迟解析。
- Gateway 冷启动时,如果 SecretRef 发生可重试的失败,并且该所有者支持隔离,则会将其隔离到已知的非 Gateway 所有者。已映射的所有者类别包括模型提供商和技能、媒体/TTS/cron 提供商、符合条件的身份验证配置、每个代理的内存、沙箱 SSH、渠道账户,以及清单声明的插件路由。Gateway 会启动,将该所有者记录为“已配置但不可用”,并发出经过脱敏的降级警告。Gateway 入口身份验证、结构无效的引用或解析值、失败即关闭的所有者,以及运行时所有者未映射的引用,仍会导致启动失败。
- 重新加载时,会分别验证每个已映射的所有者,然后发布一个原子快照。健康的所有者会刷新。符合条件的失败所有者会保留其最后已知的良好值;仅当其引用标识、提供商定义以及完整的非敏感信息所有者契约均未发生变化时,才会变为陈旧状态;发生变化或新增的失败所有者会变为冷状态。严格失败会拒绝重新加载,并保留当前活动快照。
- 策略违规(例如 OAuth 模式的身份验证配置与 SecretRef 输入组合使用)会在运行时交换之前导致激活失败。
- 运行时请求只读取当前活动的内存快照。模型提供商的 SecretRef 凭据会在到达外部传输之前,通过身份验证存储和流选项以进程本地哨兵值的形式传递。出站传送路径(Discord 回复/线程传送、Telegram 操作发送)也会读取该快照,不会在每次发送时重新解析引用。
- 只读渠道能力发现会独立评估各个账户。已配置但不可用的账户不会隐藏健康的同级账户的消息操作,但通过不可用账户直接发送仍会失败即关闭。
出口时注入(哨兵值)
对于由 SecretRefs 支持的模型提供方凭据,OpenClaw 会在模型认证解析期间生成一个不可解析、仅进程本地可见的哨兵值。因此,认证存储、流选项、SDK 配置、日志、错误对象以及大多数运行时自省看到的值都会类似于oc-sent-v1-...,而不是提供方凭据。受保护的模型获取和受管理的本地提供方健康探测会在每次请求离开进程之前,立即在 URL 和 header 值中替换已知哨兵值。
未知的、形状类似哨兵值的内容会在网络活动开始前被关闭式拒绝。OpenClaw 会拒绝发送请求,而不是将未解析的哨兵值转发给提供方。已解析的密钥值也会以精确值方式注册用于日志脱敏,作为纵深防御措施。
提供方适配器会使用其 SDK 所支持的最新注入点:
- 支持自定义 fetch 选项的 SDK 会接收 OpenClaw 受保护的 fetch,因此 SDK 会保留哨兵值。
- 不支持自定义 fetch 选项的 SDK 会在创建客户端之前立即展开哨兵值。由插件拥有的提供方流和代理运行器会在最终的核心拥有交接点展开哨兵值,因为这些传输不共享 OpenClaw 的受保护 fetch。
OPENCLAW_SECRET_SENTINELS=off(也接受 0 或 false,不区分大小写)可在事故响应或兼容性排查期间禁用哨兵值生成。该关闭开关不会禁用按精确值进行的脱敏注册。
代理访问边界
SecretRefs 可防止凭据被持久化到配置和生成的模型文件中,但它们并不是进程隔离边界。如果明文凭据留在磁盘上,且位于代理可读取的路径中,那么仍然可以通过文件或 shell 工具读取,从而绕过 API 级别的脱敏。 对于代理可访问文件纳入范围的生产部署,只有在满足以下所有条件时,才应视为迁移完成:- 受支持的凭据使用 SecretRefs,而不是明文值。
- 已从
openclaw.json、SQLite 身份验证配置文件存储、.env和生成的models.json文件中清除旧的明文残留。已弃用的身份验证 JSON 是由 doctor 管理的迁移输入,secrets apply永远不会重写它。 - 迁移后,
openclaw secrets audit --check检查结果为干净。 - 任何剩余的不受支持或需要轮换的凭据,都受到操作系统隔离、容器隔离或外部凭据代理的保护。
活动表面过滤
SecretRefs 仅在实际上处于活动状态的表面上进行验证:- 已启用的表面:映射的、可隔离的所有者所产生的可重试失败会进入冷却或过时降级状态。严格失败关闭、必须使用 Gateway 或未映射的失败会阻止启动/重新加载。
- 非活动表面:未解析的引用不会阻止启动/重新加载;它们会发出非致命的
SECRETS_REF_IGNORED_INACTIVE_SURFACE诊断信息。
非活动表面的示例
非活动表面的示例
- 已禁用的通道/账户条目。
- 未被任何已启用账户继承的顶层通道凭据。
- 已禁用的工具/功能表面。
- 未被
tools.web.search.provider选中的 Web 搜索提供方特定密钥。在自动模式(未设置 provider)下,会按优先级轮询这些密钥进行自动检测,直到某个密钥解析成功;选定后,未被选中的提供方密钥即为非活动状态。 - Sandbox SSH 认证材料(
agents.defaults.sandbox.ssh.identityData、certificateData、knownHostsData,以及每个 agent 的覆盖项)仅在有效的 sandbox 后端为ssh且 sandbox 模式不是off时才处于活动状态,适用于默认 agent 或已启用的 agent。 gateway.remote.token/gateway.remote.passwordSecretRefs 在满足以下任一条件时处于活动状态:gateway.mode=remote- 已配置
gateway.remote.url gateway.tailscale.mode为serve或funnel- 在不具备上述远程表面的本地模式下:当令牌身份验证可以胜出且未配置环境变量/身份验证令牌时,
gateway.remote.token处于活动状态;仅当密码身份验证可以胜出且未配置环境变量/身份验证密码时,gateway.remote.password才处于活动状态。
- 活动的
gateway.auth.token/gateway.auth.passwordSecretRefs 的权威性高于OPENCLAW_GATEWAY_TOKEN/OPENCLAW_GATEWAY_PASSWORD;当相应的本地配置输入缺失时,环境凭据才作为后备。
Gateway 认证表面诊断
当在gateway.auth.token、gateway.auth.password、gateway.remote.token 或 gateway.remote.password 上设置了 SecretRef 时,gateway 启动/重载会在代码 SECRETS_GATEWAY_AUTH_SURFACE 下记录表面状态:
active:该 SecretRef 是有效认证表面的一部分,且必须能够解析。inactive:其他认证表面生效,或者远程认证被禁用/未激活。
入门引用预检
在交互式入门过程中,选择 SecretRef 存储会在保存前运行预检验证:- 环境变量引用:验证环境变量名称,并确认设置期间可见的值非空。
- 提供商引用(
file、exec或store):验证提供商选择,解析id,并检查解析后的值类型。 - 快速入门流程:当
gateway.auth.token已经是 SecretRef 时,入门流程会在探测/仪表板初始化之前,使用相同的快速失败门控机制解析它(适用于env、file、exec和store引用)。
SecretRef 合约
一个对象形状,处处通用:- env
- file
- exec
- store
provider必须匹配^[a-z][a-z0-9_-]{0,63}$id必须匹配^[A-Z][A-Z0-9_]{0,127}$
Provider 配置
在secrets.providers 下定义 provider:
env 或 store 默认别名也被另一个源的条目使用,则该源的内置 provider 优先。非默认别名以及 file 或 exec provider 必须解析为具有匹配源的显式条目。
Env provider
Env provider
- 可通过
allowlist指定可选的精确名称允许列表。 - 缺失或为空的环境变量值将导致解析失败。
文件 provider
文件 provider
- 读取
path指定的本地文件。 mode: "json"(默认)要求载荷为 JSON 对象,并将id解析为 JSON 指针。mode: "singleValue"要求引用 id 为"value",并返回文件的原始内容(去除末尾换行符)。- 路径必须通过所有权/权限检查;
timeoutMs(默认 5000)和maxBytes(默认 1 MiB)限制读取操作。 - Windows 故障关闭:如果无法验证路径的 ACL,解析将失败。请将密钥移至 OpenClaw 可以验证其 ACL 的路径;provider 级别不提供绕过机制。
Exec provider
Exec provider
- 直接运行配置的绝对二进制路径,不使用 shell。
command必须是常规文件,不能是符号链接。对于包管理器 shim,请解析真实的二进制路径(例如使用realpath "$(command -v vault)"),并配置该绝对路径。使用trustedDirs将可执行文件限制在已批准的目录中。- 支持
timeoutMs(默认 5000)、noOutputTimeoutMs(默认为timeoutMs)、maxOutputBytes(默认 1 MiB)、env/passEnv白名单以及trustedDirs。 jsonOnly默认为true。当设置为jsonOnly: false且只请求一个 id 时,纯非 JSON 的 stdout 将被接受为该 id 的值。- Windows 故障关闭:如果无法验证命令路径的 ACL,解析将失败。请使用 OpenClaw 可以验证其 ACL 的命令路径;provider 级别不提供绕过机制。
- 由插件管理的 exec provider 可以使用
pluginIntegration,而不是复制command/args。OpenClaw 会在启动/重新加载期间从已安装的插件清单中解析当前命令详情;如果插件被禁用、移除、不受信任,或不再声明该集成,该 provider 上的活动 SecretRef 将故障关闭。
code 是一个可选的机器可读诊断信息。OpenClaw 会将识别出的
NOT_FOUND 和 AMBIGUOUS_DUPLICATE_KEY 代码与 provider 和 ref id 一起显示。其他
代码以及诸如 message 之类的自由格式字段可用于 protocol-v1 兼容性,
但不会显示,因为解析器输出可能包含凭据信息。Store provider
Store provider
- 从 OpenClaw 的共享状态 SQLite 数据库中读取值。
- 该 provider 不包含连接设置。
secrets.defaults.store选择其默认别名。 - 此版本仅解析 team scope。Identity scope 为后续版本预留。
共享密钥存储
共享密钥存储是一个 Gateway 范围内、团队范围的密钥和环境值存放位置,使用同一个状态数据库的每个 Gateway 进程都应能访问这些密钥和环境值。可以在 Control UI 的 Settings → Secrets 中管理,也可以在本地使用openclaw secrets store 管理。CLI 命令操作本地状态数据库,不接受 Gateway URL 或令牌选项。
条目具有 secret 或 env 类型。类型控制 CLI 的披露行为,而不是 SecretRef 解析:
secret值在保存后为只写。Gateway 列表结果、Control UI 以及 CLI 的 list/get 输出都不会包含这些值;不存在 reveal RPC。env值在 Control UI 中对管理员保持可见,并且可以通过store list和store get返回。团队作用域的env条目还会被添加到 OpenClaw 自有 exec 工具所运行命令的环境中,顺序位于继承的进程值之后、显式的每次调用环境变量之前。受保护的主机密钥和被沙箱阻止的凭据名称会被忽略,并发出可见警告。这涵盖直接工具调用、Code Mode(其来宾通过同一个openclaw:core:exec工具访问 shell)、沙箱 exec,以及由node承载的 exec。
secret 条目永远不会注入子进程环境。它们只能通过 store SecretRef 使用,因为明文环境变量注入会绕过存储披露边界;安全的密钥注入需要未来的 egress 替换机制。
名称使用与 env SecretRef 相同的大写语法,并且每个 UTF-8 值限制为 64 KiB(65,536 字节)。secret 条目必须携带值;空密钥会被拒绝,因为它们只会导致令人困惑的下游身份验证失败。env 条目可以为空。这支持 PEM 密钥和服务账户 JSON,而不受普通环境变量较小限制的影响。
使用 store 源从 openclaw.json 引用条目:
store SecretRef 引用时,Control UI 的设置/删除操作会自动刷新活动密钥运行时。未被引用的名称会跳过该操作。直接使用 CLI 写入仍然是离线/本地路径;使用 CLI 更改配置引用的值后,运行 openclaw secrets reload,以便活动内存快照获取该值。
文件支持的 API 密钥
不要在配置的env 块中放置 file:... 字符串。该块是字面量且不会被覆盖,因此这里的 file:... 永远不会被解析。
请改为在受支持的凭据字段上使用文件类型的 SecretRef:
mode: "singleValue",SecretRef 的 id 是 "value"。对于 mode: "json",请使用绝对 JSON Pointer,例如 "/providers/xai/apiKey"。
有关接受 SecretRef 的字段,请参见 SecretRef Credential Surface。
Exec 集成示例
有关服务账户、捆绑代理技能和故障排除的专门 1Password 指南,请参见 1Password。1Password
1Password
op CLI 和插件的服务账户令牌文件。Bitwarden Secrets Manager (`bws`)
Bitwarden Secrets Manager (`bws`)
使用一个解析器包装器将 SecretRef ID 映射到 Bitwarden Secrets Manager 条目 key。仓库包含 该解析器会批量处理请求的 ID,运行
scripts/secrets/openclaw-bws-resolver.mjs;请将其安装或复制到运行 Gateway 的主机上的绝对可信路径。要求:- Gateway 主机上已安装 Bitwarden Secrets Manager CLI (
bws)。 BWS_ACCESS_TOKEN可供 Gateway 服务使用。- 将
PATH传递给解析器,或将BWS_BIN设置为绝对的bws二进制路径。 - 在使用自托管 Bitwarden 实例时,环境中已设置
BWS_SERVER_URL。
bws secret list,并返回匹配 secret key 字段的值。请使用符合 exec SecretRef ID 契约的 key,例如 openclaw/providers/openai/apiKey;在解析器运行前,带下划线的环境变量风格 key 会被拒绝。如果多个可见的 Bitwarden secret 共享请求的 key,解析器会将该 ID 判定为歧义并失败,而不是猜测。更新配置后,请验证解析器路径:HashiCorp Vault CLI
HashiCorp Vault CLI
password-store (`pass`)
password-store (`pass`)
使用一个小型解析器包装器将 SecretRef ID 直接映射到 然后配置 exec provider,并将 将 secret 保留在
pass 条目。将其保存为位于绝对路径下、可通过你的 exec-provider 路径检查的可执行文件,例如 /usr/local/bin/openclaw-pass-resolver。#!/usr/bin/env node shebang 会从解析器进程的 PATH 中解析 node,因此请在 passEnv 中包含 PATH。如果 pass 不在该 PATH 上,请在父环境中设置 PASS_BIN,并同样将其包含在 passEnv 中:apiKey 指向 pass 条目路径:pass 条目的第一行,或者自定义包装器以返回完整的 pass show 输出。更新配置后,请同时验证静态审计和 exec 解析器路径:sops
sops
MCP 服务器环境变量
通过plugins.entries.acpx.config.mcpServers 配置的 MCP 服务器环境变量支持 SecretInput,可将 API 密钥和令牌排除在明文配置之外:
${MCP_SERVER_API_KEY} 这样的环境变量模板引用和 SecretRef 对象会在网关激活期间、MCP 服务器进程启动之前解析。与其他 SecretRef 使用位置一样,未解析的引用只有在 acpx 插件实际处于激活状态时才会阻止激活。
沙箱 SSH 认证材料
核心ssh 沙箱后端也支持用于 SSH 认证材料的 SecretRef:
- OpenClaw 会在沙箱激活期间解析这些引用,而不是在每次 SSH 调用时懒加载。
- 解析后的值会写入一个临时目录,文件权限受限(
0o600),并用于生成的 SSH 配置。 - 如果实际生效的沙箱后端不是
ssh(或者沙箱模式为off),这些引用会保持不激活状态,不会阻止启动。
支持的凭据范围
Canonical 支持和不支持的凭据列在 SecretRef Credential Surface 中。运行时生成或轮换的凭据,以及 OAuth 刷新材料,特意不包含在只读 SecretRef 解析中。
必需行为与优先级
- 没有 ref 的字段:保持不变。
- 带有 ref 的字段:在激活期间,对活动表面是必需的。
- 如果同时存在明文和 ref,则在受支持的优先级路径上,ref 优先。
- 脱敏哨兵
__OPENCLAW_REDACTED__仅保留用于内部配置脱敏/恢复,并且作为字面提交的配置数据会被拒绝。
SECRETS_REF_OVERRIDES_PLAINTEXT(运行时警告)REF_SHADOWED(当 SQLite 身份验证配置文件凭据优先于openclaw.json引用时的审计发现)STORE_PLAINTEXT_RESIDUE(当存储名称仍具有等效明文配置值时的审计发现)
serviceAccount 接受内联 JSON 或 SecretRef。当该规范字段未设置时,Doctor 会将已弃用的同级字段 serviceAccountRef 移入此规范字段。
激活触发器
密钥激活在以下情况下运行:- 启动(预检加最终激活)
- 配置重新加载热应用路径
- 配置重新加载重启检查路径
- 通过
secrets.reload手动重新加载 - Gateway 配置写入 RPC 预检(
config.set/config.apply/config.patch),在持久化编辑前验证所提交配置载荷中的活动面 SecretRef
- 成功后以原子方式交换快照。
- 严格启动失败会中止 Gateway 启动。
- 冷启动期间,对于已映射且可隔离的非 Gateway 所有者,如果发生可重试的解析失败,可以发布快照,并将该确切所有者配置为不可用。针对该所有者的请求会失败并返回
SECRET_SURFACE_UNAVAILABLE;模型提供商所有者的显式引用失败后,不会再回退到环境变量或身份验证配置文件中的凭据。 - 重新加载和重启检查会隔离符合条件的已映射所有者。对于引用标识未改变、提供商定义未改变且完整的非密钥所有者契约未改变的所有者,其确切的最近一次已知良好值会作为过期值保留;对于已更改或新配置但无法解析的引用,仅为该所有者发布冷状态。严格重新加载失败会保留之前处于活动状态的快照。
config.set、config.apply和config.patch接受可隔离所有者的语法有效但尚未解析的引用,并返回经过脱敏的degradedSecretOwners报告。Gateway 入口认证、结构无效的配置或已解析值、策略违规以及未知所有者仍会在磁盘变更前被拒绝。- 即使另一个所有者处于冷状态或过期状态,状态正常的同级所有者仍会正常解析并发布。
- 向出站辅助程序/工具调用提供显式的每次调用通道令牌不会触发 SecretRef 激活;激活点仍为启动、重新加载和显式调用
secrets.reload。
降级与恢复信号
当在健康状态之后进行重新加载时激活失败,OpenClaw 会进入降级的密钥状态,并发出一次性系统事件和日志代码:SECRETS_RELOADER_DEGRADEDSECRETS_RELOADER_RECOVERED
- 降级:健康所有者会刷新,陈旧所有者会保留最后已知的良好状态,而冷启动所有者仍不可用。
- 恢复:在下一次成功激活后发出一次。
- 在已经处于降级状态时反复失败会记录警告,但不会再次发出事件。
- 严格启动失败永远不会发出降级事件,因为运行时从未变为活动状态。成功启动但存在冷启动所有者时会记录所有者降级,但不会发出重新加载器事件。
- 作用域为引用的启动和重新加载失败会为每个受影响的所有者发出结构化的
SECRETS_DEGRADED警告。作用域为提供者的中断会发出一条包含提供者和完整受影响所有者列表的SECRETS_PROVIDER_DEGRADED警告,而不是针对每个所有者重复记录提供者故障。警告包含经过脱敏的原因、cold或stale所有者状态,以及openclaw secrets reload重试提示。警告中绝不会包含解析后的值或 SecretRef id。 openclaw doctor会列出冷启动和陈旧所有者、其受影响的配置路径、经过脱敏的原因以及重试指引。
命令路径解析
命令路径可以通过网关快照 RPC 选择性使用受支持的 SecretRef 解析。适用两种广泛行为:- 严格命令路径
- 只读命令路径
例如
openclaw memory 远程内存路径,以及当 openclaw qr --remote 需要远程共享密钥引用时的情况。它们从活动快照读取,在所需 SecretRef 不可用时快速失败。- 后端密钥轮换后,快照刷新由
openclaw secrets reload处理。 - 这些命令路径使用的网关 RPC 方法:
secrets.resolve。
审计与配置工作流
默认操作流程:1
审计当前状态
2
配置并应用 SecretRefs
3
重新审计
configure 过程中保存了一个计划而不是直接应用,那么在重新审计之前,使用 openclaw secrets apply --from <plan-path> 应用该已保存的计划。
secrets 审计
secrets 审计
发现项包括:
- 静态存储中的明文值(
openclaw.json、SQLite auth-profile 行、.env以及生成的agents/*/agent/models.json)。 - 生成的
models.json条目中敏感提供方头部的明文残留。 - 未解析的引用。
- 优先级遮蔽(SQLite auth profiles 优先于
openclaw.json引用)。 - 存储残留(存储的名称在配置中仍然存在等效的明文值)。
openclaw secrets audit --allow-exec 可在审计期间执行 exec provider。头部残留说明:敏感提供方头部检测基于名称启发式规则(常见的认证/凭据头名称及其片段,例如 authorization、x-api-key、token、secret、password 和 credential)。secrets 配置
secrets 配置
交互式助手,功能包括:
- 首先配置
secrets.providers(env/file/exec/store,添加/编辑/删除)。 - 允许你在
openclaw.json中选择受支持的携带密钥字段,以及某个代理作用域的 SQLite auth-profile 存储。 - 可以直接在目标选择器中创建新的 auth-profile 映射。
- 采集 SecretRef 详细信息(
source、provider、id)。 - 执行预检解析,并可立即应用。
--allow-exec,否则预检会跳过 exec SecretRef 检查。如果你通过 configure --apply 直接应用,并且计划中包含 exec refs/providers,那么在应用步骤中也要保持设置 --allow-exec。有用的模式:openclaw secrets configure --providers-onlyopenclaw secrets configure --skip-provider-setupopenclaw secrets configure --agent <id>
configure 的默认应用行为:- 从目标提供方的 SQLite 身份验证配置文件记录中清除匹配的静态凭据。
- 保留已弃用的
auth.json不变;运行openclaw doctor --fix以迁移并归档它。 - 从生效状态文件和活动配置
.env文件中清除已知的匹配密钥行(当两个路径匹配时会去重)。
secrets 应用
secrets 应用
应用已保存的计划:执行说明:除非设置了
--allow-exec,否则 dry-run 会跳过 exec 检查;写入模式会拒绝包含 exec SecretRefs/providers 的计划,除非设置了 --allow-exec。有关严格目标/路径契约详情和精确拒绝规则,请参见 Secrets 应用计划契约。单向安全策略
安全模型:- 在进入写入模式之前,预检必须成功。
- 在提交之前,会验证运行时激活。
- 应用会使用原子文件替换更新文件,并在失败时尽最大努力进行恢复。
旧版认证兼容性说明
对于静态凭据,运行时不再依赖明文旧版认证存储。- 运行时凭据来源是已解析的内存快照。
- 发现旧的静态
api_key条目时会将其清理。 - 与 OAuth 相关的兼容行为仍然是独立的。
控制 UI
打开 设置 → 密钥,即可列出、添加、编辑、批量导入或软删除团队范围的条目。批量添加接受 dotenvNAME=VALUE 赋值,包括带引号的多行值。类似凭据的名称默认为 secret;取消选择 自动检测密钥,即可将所有条目作为可见的环境值导入。
此存储页面仅管理值。通过其设置表单或原始编辑器,在受支持的字段上配置相应的 store SecretRef。身份范围的条目留待后续版本处理,本页面不会显示这些条目。
相关内容
- 认证 - 认证设置
- CLI:密钥 - CLI 命令
- Vault SecretRefs - HashiCorp Vault 提供程序设置
- 环境变量 - 环境优先级
- SecretRef 凭据面 - 凭据面
- Secrets 应用计划契约 - 计划契约详情
- 安全 - 安全态势。