添加Entitlements后MacOS代码签名失效,求正确配置方法
解决Mac M1命令行工具添加Entitlements后验证失败的问题
排查与修复步骤
1. 验证Entitlements文件有效性
先确保权限配置文件无语法错误:
plutil -lint macos-entlist.plist
输出OK则格式正常,否则修复XML语法问题(注意实际文件中需用原生双引号",而非转义字符"),同时确认文件为无BOM的UTF-8编码。
2. 检查签名权限嵌入情况
签名完成后,确认权限已正确附加到可执行文件:
codesign -d --entitlements - server/executable
对比输出内容与你的plist文件是否一致。再用codesign -dv server/executable查看完整签名信息,和同目录下正常运行的可执行文件做对比,定位差异点。
3. 调整Entitlements适配JVM需求
加载Oracle JVM仅开启disable-library-validation可能不足,建议调整权限配置:
<?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.disable-library-validation</key> <true/> <key>com.apple.security.cs.allow-unsigned-executable-memory</key> <true/> <key>com.apple.security.cs.allow-jit</key> <true/> <key>com.apple.security.get-task-allow</key> <false/> </dict> </plist>
JVM的即时编译和动态内存分配依赖allow-jit与allow-unsigned-executable-memory权限,关闭不必要的权限(如无需动态修改环境变量可关闭allow-dyld-environment-variables)。
4. 重新执行签名公证流程
- 清除旧签名:
codesign --remove-signature server/executable - 重新签名(添加
--deep确保关联资源都被正确签名):codesign --sign $IDENTITY --entitlements macos-entlist.plist --options runtime --deep --timestamp server/executable - 本地验证签名:
spctl -a -vvv server/executable
输出accepted则本地验证通过,再打包进行公证。
5. 查看系统日志定位具体错误
若仍报错,通过安全日志获取详细失败原因:
log show --predicate 'process == "syspolicyd"' --info --last 10m
日志会明确指出验证失败的核心问题(如权限不兼容、签名哈希不匹配等)。
内容的提问来源于stack exchange,提问作者user10651076
相关产品推荐
相关产品推荐

