14.13 签名机制

macOS 应用签名通过 scripts/package-mac-app.sh 脚本实现,该脚本负责设置 Bundle ID、签名二进制文件、注入构建元数据(例如"OpenClawBuildTimestamp"),并通过稳定的身份和路径保留 TCC 权限。

签名流程

OpenClaw 使用自动化脚本处理代码签名:

# 执行签名和打包
./scripts/package-mac-app.sh

签名要求

  • 证书类型:使用 Apple Development 或 Developer ID 证书
  • Bundle ID:保持 Bundle ID 稳定以维持权限
  • 签名一致性:使用真实证书确保签名在重建时保持稳定
  • 时间戳:注入构建时间戳用于版本跟踪

构建元数据

签名脚本会注入以下元数据:

  • OpenClawBuildTimestamp:构建时间戳
  • 版本信息:应用版本和构建号
  • 签名标识:代码签名身份信息

权限保留

稳定的签名对于保留 macOS TCC 权限至关重要:

  • 使用固定的安装路径(例如 dist/OpenClaw.app)
  • 保持 Bundle ID 不变
  • 使用真实证书而非临时签名
  • 在开发和生产环境使用相同的签名配置
临时签名警告
临时签名(ad-hoc)会在每次构建时生成新的身份,导致 macOS 遗忘之前的权限授予。生产环境和测试权限时,始终使用真实的 Apple 开发者证书

签名验证

验证应用签名状态:

# 检查代码签名
codesign -vv -d dist/OpenClaw.app

# 验证签名有效性
codesign --verify --deep --strict --verbose=2 dist/OpenClaw.app

# 查看签名身份
codesign -d --extract-certificates dist/OpenClaw.app

开发环境配置

  1. 在 Xcode 中配置开发者账户
  2. 下载并安装 Development 或 Developer ID 证书
  3. 配置代码签名身份到构建脚本
  4. 确保钥匙串中证书可访问

公证流程

macOS 10.15+ 要求应用通过公证:

  • 使用 Developer ID 证书签名
  • 配置公证凭证(Apple ID 和应用专用密码)
  • 通过 xcrun notarytool 提交公证
  • 将公证票据附加到应用
最佳实践
将签名和公证集成到 CI/CD 流程中,确保每个发布版本都正确签名和公证。使用环境变量管理证书和凭证,避免硬编码敏感信息。