Mac M1/M2代码签名与公证相关问题咨询
Mac ARM架构命令行工具分发问题解答
1. 命令行可执行文件的行为是否符合预期?
完全符合预期。
- Finder双击触发的是macOS Gatekeeper针对GUI程序的完整校验逻辑,而命令行工具并非为GUI交互设计,即便已签名公证,Finder仍会弹出“无法确认开发者身份”提示。
- 终端运行时,Gatekeeper对已公证的命令行工具采用宽松校验规则,只要文件签名有效且通过公证,就能正常执行——这和你观察到的JDK
.tar.gz包中java命令的表现完全一致。
2. 如何让加载动态库的程序像Intel Mac未签名包那样正常工作?
报错“加固程序不允许使用相对路径”源于签名后的程序默认启用了Hardened Runtime(加固运行时),该特性会限制动态库加载路径以提升安全性。要实现类似未签名包的加载行为,有两种标准方案:
方案一:使用@rpath调整动态库路径(推荐)
这是符合Apple安全规范的做法,步骤如下:
- 修改动态库的安装名称:
install_name_tool -id "@rpath/libxxx.dylib" libxxx.dylib - 给可执行文件添加
rpath(假设动态库放在可执行文件同级的lib目录):install_name_tool -add_rpath "@executable_path/lib" your_tool - 重新签名可执行文件和动态库,确保签名包含
Hardened Runtime选项。
方案二:添加权限绕开路径限制(仅特殊场景使用)
如果必须保留相对路径加载,可通过签名时添加授权文件关闭库验证:
- 创建
entitlements.plist文件,内容如下:<?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/> </dict> </plist> - 签名时指定该授权文件:
codesign --force --sign "Developer ID Application: Your Company" --options runtime --entitlements entitlements.plist your_tool
注意:该权限可能影响公证通过率,仅在无法调整路径时使用。
3. 是否可以对.tar.gz格式的包进行公证并分发?
可以,Apple公证服务支持包括.tar.gz在内的任意压缩包格式,只需满足以下条件:
- 包内所有可执行文件、动态库均已用有效的Developer ID签名,且开启
Hardened Runtime; - 提交公证时使用
notarytool或altool工具上传.tar.gz包,公证通过后,用户下载运行时Gatekeeper会自动校验公证记录; - 注意:
.tar.gz包无法使用stapler嵌入公证信息(仅.app、.pkg等格式支持),但不影响分发,Gatekeeper会通过网络校验公证状态。
内容的提问来源于stack exchange,提问作者user10651076
相关产品推荐
相关产品推荐

