macOS 签名与公证 — 验证¶
如何验证 Electron macOS 应用的签名、公证以及 Gatekeeper 是否放行。凭据与发布流程见 RELEASING.md;面向终端用户的 Gatekeeper 帮助见 install/macos.md。
发布版本如何签名¶
electron-release.yml 使用 electron-builder 打包 macOS。当 Developer ID 证书(ELECTRON_MACOS_CSC_LINK、ELECTRON_MACOS_CSC_KEY_PASSWORD)和 Apple 公证凭据(APPLE_ID、APPLE_APP_SPECIFIC_PASSWORD、APPLE_TEAM_ID)全部存在时,构建会同时启用 Hardened Runtime 和公证(见 electron/electron-builder.config.mjs)。当凭据缺失时,发布流程会拒绝执行,除非所有者明确设置 allow_unsigned=true;并且在发布前会运行:
codesign --verify --deep --strict "VoiceStudio.app"
spctl --assess --type execute --verbose=2 "VoiceStudio.app"
xcrun stapler validate "VoiceStudio.app"
在没有凭据的情况下(产物演练、本地 bun run dist),生成的包会保持 electron-builder 的未签名/ad-hoc 默认配置;用户随后会看到安装指南中描述的“未识别的开发者”提示。
| 类别 | 用户看到的内容 | 是否需要终端? |
|---|---|---|
| 未签名 / 签名损坏 | “应用已损坏”——无法通过 GUI 绕过 | 是(xattr) |
| ad-hoc 签名 | “未识别的开发者”→ 右键 → 打开 / “仍要打开” | 否 |
| Developer ID,未公证 | “未识别的开发者”→ 右键 → 打开 | 否 |
| Developer ID + 已公证 + 已装订 | 直接双击即可打开 | 否 |
签名发布版本的要求¶
- 所有嵌套的二进制文件、框架、辅助应用和动态库(包括 Rust 原生辅助程序和内置的
uv)都必须在根应用包之前完成签名;不允许存在未签名的嵌套组件。 - 应用使用 Developer ID Application 证书签名,完成公证,并已装订公证票据。
- 已签名的应用中必须包含麦克风权利(
com.apple.security.device.audio-input,位于electron/build/entitlements.mac.plist)。 - 从草稿发布下载的 DMG 在干净的 Mac 上打开时,不应出现“已损坏”“移到废纸篓”或任何其他 Gatekeeper 拒绝提示;无论是全新安装,还是从上一版本升级,都应如此。
- 如果签名或公证失败,请停止发布并报告确切错误,而不是发布未签名的产物。
在本地验证应用包¶
scripts/verify-macos-signing.sh 会执行 codesign、Gatekeeper、stapler 以及(凭据可用时)notarytool 检查,并报告 PASS / WARN / FAIL:
# Auto-discover the most recent built .app:
scripts/verify-macos-signing.sh
# A specific bundle or DMG (for example from electron/release/):
scripts/verify-macos-signing.sh "path/to/VoiceStudio.app"
scripts/verify-macos-signing.sh ~/Downloads/VoiceStudio-*.dmg
# Release gate — fail on any unsigned or un-notarized component:
scripts/verify-macos-signing.sh "VoiceStudio.app" --require-signed
当环境中存在凭据(NOTARYTOOL_KEYCHAIN_PROFILE,或 APPLE_ID + APPLE_PASSWORD + APPLE_TEAM_ID)时,会运行 xcrun notarytool history;否则会跳过并给出相应提示。
本地开发¶
仅针对本地测试产物:移除隔离属性,使未签名构建无需“右键 → 打开”即可启动:
这绝不能替代对已发布版本进行的 Developer ID 签名与公证。
已归档的 Tauri 应用曾使用另一套流水线(tauri-action、APPLE_CERTIFICATE* 密钥、MACOS_SIGNING_ENABLED);这些都不适用于 Electron。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 om/VoiceStudio