mac 签名(调试构建)¶
scripts/package-mac-app.sh 会构建一个暂存应用,调用 scripts/codesign-mac-app.sh,并在替换 dist/OpenClaw.app 之前验证已签名的 worker。macOS 将 TCC 权限与包 ID 和代码签名绑定。在重新构建之间保持两者稳定,并将应用保持在固定路径。这样 macOS 会保留其 TCC 授权(通知、辅助功能、屏幕录制、麦克风、语音)。
- 调试包标识符默认为
ai.openclaw.mac.debug(使用BUNDLE_ID=...覆盖)。 - Node:
>=24.16.0 <25或>=26.1.0(仓库package.json的engines)。打包器还会构建 Control UI(pnpm ui:build)。 - 默认要求真实的签名身份。如果找不到身份且未设置
ALLOW_ADHOC_SIGNING,codesign 脚本会退出并报错。临时签名(SIGN_IDENTITY="-")需要显式选择,并且不会在重新构建之间持久化 TCC 权限。参见 macOS 权限。 - 从环境变量读取
SIGN_IDENTITY(例如export SIGN_IDENTITY="Apple Development: Your Name (TEAMID)",或 Developer ID Application 证书)。如果没有它,codesign-mac-app.sh会自动选择一个身份。顺序为 Developer ID Application、Apple Distribution、Apple Development,然后是最先找到的有效签名身份。 SIGN_IDENTITY还接受证书 SHA-1 哈希,以区分具有相同通用名称的证书。CODESIGN_TIMESTAMP=auto(默认)会为按名称或证书哈希选择的 Developer ID Application 签名启用可信时间戳。设置on/off可强制启用或禁用。- 在 Info.plist 中写入
OpenClawBuildTimestamp(ISO8601 UTC)和OpenClawGitCommit。提交值为完整的 40 位十六进制提交,或在本地构建中不可用时为unknown。原生 About 选项卡会显示构建时间戳和 git 提交。 - 签名后审计原生签名格式和 Team ID。元数据失败、非原生签名、缺失 Team ID 以及 Team ID 不匹配默认都会导致失败。
SKIP_TEAM_ID_CHECK=1仅跳过 Team ID 比较。原生签名格式检查仍会运行。 - 在封存应用之前,签名私有 worker 的原生代码。JIT 内存授权仅授予 worker 的
bin/node和 Claude Agent SDK 的claude可执行文件。对于claude可执行文件,仅当显式捆绑的插件包含它们时适用。签名器对其他原生辅助程序和库执行普通签名。这些签名保留库验证,并要求使用应用的签名身份。捆绑的 Anthropic 插件使用单独安装的 Claude Code 可执行文件。打包会在签名前后,于临时状态中验证每个请求架构的原生能力和 worker 就绪状态。
签名使用 /usr/bin/python3 扫描文件头,并通过 /usr/bin/file 批量处理候选项。Apple 的 /usr/bin/otool 随后检查每个架构的原生头,包括 file 报告为数据的 fat64 容器。混合签名类别和格式错误的原生头会停止签名。Java 类、静态归档以及 Mach-O 链接器、调试和核心产物会被资源封存,而不是直接签名。发现过程打开目录时不跟随符号链接,并对已打开的文件描述符进行分类,而不是对可重定向路径进行分类。它不会运行捆绑的 Node 来签名自身。在发布前,扫描会检查每个观察到的输入,包括目录命名空间以及从原生列表中省略的资源。它会拒绝不完整的遍历和观察到的变更。这不是原子文件系统快照。
签名审计还要求具备原生 Mach-O 签名。某些 Apple 工具链在将原始 fat64 作为通用数据签名且没有原生授权时仍会返回成功。审计会拒绝该结果。签名器不会精简或转换输入容器。对于不支持的原生负载,请在打包前将其重新构建为与 codesign 兼容的代码,而不是依赖通用签名验证。
签名器在嵌套代码之后,一次性封存 App 和 Sparkle 包。对包的主可执行文件单独签名也会重新封存该包的资源。签名器封存应用后,新的清单会用于 Team ID 和提权审计。扫描器或分类器失败会停止签名。Worker 可移植性检查会保持每个架构的加载器路径相互独立,并拒绝不可移植的依赖项以及损坏或逃逸的符号链接。
签名一个没有其他进程修改的私有暂存副本。签名器在属性清理前会拒绝硬链接文件和 FIFO 等特殊文件。如果此检查失败,请复制或重新构建该包。属性清理和签名使用 macOS 的 /usr/bin/sandbox-exec。它将文件系统写入限制在固定应用和临时签名目录中。额外的继承文件描述符会被关闭。如果无法启动此变更边界,签名将失败。没有无限制的回退方案。
用法¶
# from repo root
scripts/package-mac-app.sh # auto-selects identity; errors if none found
SIGN_IDENTITY="Developer ID Application: Your Name" scripts/package-mac-app.sh # real cert
ALLOW_ADHOC_SIGNING=1 scripts/package-mac-app.sh # ad-hoc (permissions will not stick)
SIGN_IDENTITY="-" scripts/package-mac-app.sh # explicit ad-hoc (same caveat)
DISABLE_LIBRARY_VALIDATION=1 scripts/package-mac-app.sh # dev-only Sparkle Team ID mismatch workaround
Worker 打包会遵循现有的 OPENCLAW_DOCKER_PACKAGE_INVENTORY_TIMEOUT_MS、
OPENCLAW_DOCKER_PACKAGE_PACK_TIMEOUT_MS 和
OPENCLAW_DOCKER_PACKAGE_TARBALL_CHECK_TIMEOUT_MS 预算。每个默认值为五
分钟;当打包需要更多时间时,请设置为毫秒单位的正整数。
这些预算通过 worker 的隔离环境传递,而不会暴露
操作员凭据或状态。tarball 检查预算覆盖整个检查,
包括解包和验证。
临时签名说明¶
SIGN_IDENTITY="-" 会禁用增强型运行时(--options runtime)。这可防止应用在加载未共享相同 Team ID 的嵌入式框架(如 Sparkle)时崩溃。临时签名还会破坏 TCC 权限持久性。有关恢复步骤,请参阅 macOS 权限。
关于页面的构建元数据¶
选择 关于 OpenClaw,以在原生连接窗口中选择 关于。它会显示来自 Info.plist 的应用版本和构建号、构建日期以及缩短的 git 提交,即使没有 Gateway 连接也是如此。将鼠标悬停在提交或日期上可查看完整值,或选择 复制构建信息 以复制所有构建元数据。缺失或无效的时间戳和提交值将显示为不可用。代码更改后,重新运行打包器以刷新这些值。应用更新控件位于 仪表盘 → 设置 → 更新 → 此 Mac 下。
相关¶
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw