Electron打包代码签名失败,公证后证书无效致应用崩溃求助
问题现象
1. 打包时代码签名失败
执行打包后收到如下错误:
Packaging ApplicationWARNING: Code sign failed; please retry manually. Error: Command failed: spctl --assess --type execute --verbose --ignore-cache --no-cache /var/folders/kw/fp514mmd4djdrld7q8_ttp4r0000gr/T/electron-packager/darwin-x64/myapp-darwin-x64/myapp.app /var/folders/kw/fp514mmd4djdrld7q8_ttp4r0000gr/T/electron-packager/darwin-x64/myapp-darwin-x64/myapp.app: rejected
2. 公证后应用启动崩溃
完成公证后启动应用直接崩溃,错误日志如下:
Crashed Thread: 0 Dispatch queue: com.apple.main-thread Exception Type: EXC_BAD_ACCESS (SIGKILL (Code Signature Invalid)) Exception Codes: UNKNOWN_0x32 at 0x0000001e0000a5c0 Exception Codes: 0x0000000000000032, 0x0000001e0000a5c0 Exception Note: EXC_CORPSE_NOTIFY Termination Reason: Namespace CODESIGNING, Code 2
打包配置(electron.config.js)
osxSign: { identity: 'Developer ID Application: ### (###)', }, osxNotarize: { appleId: '###', appleIdPassword: '###', teamId: '###', ascProvider: '###', },
已知信息
证书在Xcode、钥匙串访问及security find-identity -p codesigning -v命令中均正常显示,且已关联对应私钥;默认配置下问题依旧,手动指定证书后无改善。
可能原因及排查解决办法
证书权限或钥匙串访问问题
打开钥匙串访问,找到对应Developer ID证书,右键「显示简介」→「访问控制」,确认勾选「允许所有应用访问此项目」,或至少添加electron-packager、codesign等工具;尝试用sudo重新打包(注意sudo环境变量需包含electron相关命令)。签名配置参数缺失
补充osxSign的必要参数,macOS公证要求开启硬运行时,示例配置:osxSign: { identity: 'Developer ID Application: ### (###)', hardenedRuntime: true, gatekeeperAssess: false, entitlements: './entitlements.plist', entitlementsInherit: './entitlements.plist' }同时确保
entitlements.plist包含Electron应用所需权限:<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>com.apple.security.cs.allow-jit</key> <true/> <key>com.apple.security.cs.allow-unsigned-executable-memory</key> <true/> <key>com.apple.security.cs.debugger</key> <true/> </dict> </plist>缓存或临时文件问题
删除electron-packager生成的临时目录,清理打包缓存后重新打包;执行spctl --remove-cache清除Gatekeeper缓存,再用spctl --assess --type execute --verbose /path/to/your/app.app重新验证签名。公证流程不完整或失败
用xcrun altool --notarization-info <RequestUUID> -u <appleId>查询公证结果(RequestUUID可在打包日志中找到),确认公证是否真的成功,若有警告需修正后重新提交。工具兼容性问题
检查electron、electron-packager版本是否适配当前macOS签名要求,尝试升级到最新稳定版;也可切换到electron-builder,其签名和公证流程更成熟。系统权限或环境问题
确保当前用户有足够系统权限,避免在受限账户下操作;执行sudo spctl --master-enable确保Gatekeeper启用(公证应用需其验证),打包时可通过gatekeeperAssess: false跳过提前检查。
内容的提问来源于stack exchange,提问作者Nestoro

