macOS 代码签名
口径说明
融云公开文档不覆盖 macOS 原生 SDK 与桌面交付链(dmg / 代码签名 / 公证 / 分发 / Gatekeeper);本页为本项目按 Apple 与 Electron 官方实践补齐的接入文档。
macOS 用代码签名标识“这个应用是谁发布的、包内容有没有被改过”。本地开发验证可用 ad-hoc 签名;对外分发必须用 Developer ID Application 证书,并配合公证(notarization)才能通过 Gatekeeper。
两种签名方式
| 方式 | 适用 | 命令 | Gatekeeper |
|---|---|---|---|
| ad-hoc | 本地开发 / 内部测试(不对外分发) | `codesign --force --deep --sign - "App.app"` | 本机可运行;其它机器仍提示未验证 |
| Developer ID | 对外分发 | electron-builder 自动调用 `codesign`,或用 `codesign --sign "Developer ID Application: ..."` | 签名 + 公证后通过 |
ad-hoc 签名(本地验证)
Shell
# electron-builder 产出后,做一次 ad-hoc 签名
codesign --force --deep --sign - "dist/mac/My Desktop.app"
# 验证
codesign -dv --verbose=4 "dist/mac/My Desktop.app"
codesign --verify --deep --strict --verbose=2 "dist/mac/My Desktop.app"ad-hoc 签名只保证包内一致性,不提供发布者身份;换机器或重新下载后仍会被 Gatekeeper 拦截,属于预期。
Developer ID 签名(对外分发)
Shell
# 1) 确认证书已安装(钥匙串 → 我的证书)
security find-identity -v -p codesigning
# 2) 导出 .p12 并在 CI 中以环境变量提供(不要提交到仓库)
# CSC_LINK=file:///path/to/developer-id.p12
# CSC_KEY_PASSWORD=********
# 3) electron-builder 签名 + 公证(公证见下一页)
CSC_LINK="$PWD/certs/developer-id.p12" \
CSC_KEY_PASSWORD="$CSC_KEY_PASSWORD" \
npx electron-builder --mac --x64 --arm64签名参数说明
| 参数 | 作用 | 建议 |
|---|---|---|
| `--options runtime` | 启用 hardened runtime(公证前置条件) | 发布包必须开启 |
| `--entitlements build/entitlements.mac.plist` | 声明 JIT / 网络等能力 | 最小权限,逐项确认 |
| `--deep` | 递归签名嵌套 framework / helper | electron-builder 默认处理;手动签名时使用 |
| `--timestamp` | 签名附可信时间戳 | 发布包必须;避免证书过期后签名失效 |
| `--sign -` | ad-hoc 签名 | 仅本地验证 |
验证签名
Shell
codesign -dv --verbose=4 "dist/mac/My Desktop.app" # Authority / TeamIdentifier / flags
codesign --verify --deep --strict --verbose=2 "dist/mac/My Desktop.app"
spctl -a -vvv "dist/mac/My Desktop.app" # 公证后应为 accepted
# 查看嵌套组件签名
codesign -dv --verbose=4 "dist/mac/My Desktop.app/Contents/Frameworks/Electron Framework.framework"常见问题
| 报错 | 原因 | 处理 |
|---|---|---|
| `code object is not signed at all` | 嵌套 framework 未签名 | 用 `--deep` 或让 electron-builder 统一签名 |
| `errSecInternalComponent` | 钥匙串未解锁 / 权限不足 | `security unlock-keychain`,CI 中先导入证书 |
| `invalid signature (code or signature have been modified)` | 签名后修改了包内容 | 重新打包并重新签名 |
| `resource fork, Finder information, or similar detritus not allowed` | 包内残留扩展属性 | `xattr -cr "App.app"` 后重新签名 |