我用 Qt5 开发了一个 Mac 应用程序,所以在 Xcode 之外。我希望 GateKeeper 允许我的应用程序在客户的计算机上运行,而不是发出“无法打开,因为无法确认开发人员的身份”警告。
我已经成功地对应用程序进行了数字签名,但 GateKeeper 仍然带有此投诉。我有一个 Apple 开发者证书(我是团队代理),我的钥匙串说它是有效的。我还安装了两个 Apple 根证书。
我使用命令行实用程序codesign
对 app 文件夹中的所有二进制文件进行数字签名,此外我还对 app 文件夹本身进行了数字签名。在所有情况下,codesign 的响应都是信息丰富的,并且没有显示错误。使用 codesign,我可以检查所有二进制文件是否都已签名,正在运行
$ codesign --verify --deep --verbose=2 MyApp.app
表明所有二进制文件都经过验证。此外,它还报告:
MyApp.app:在磁盘上有效
MyApp.app:满足其指定要求
跑步:
$ codesign -v --verbose=4 --display MyApp.app
给
可执行文件=/Users/xxx/trunk/yyy/deploy/release/MyApp.app/Contents/MacOS/MyApp
Identifier=aaaa.MyApp
格式=与 Mach-O Thin (x86_64)
捆绑 CodeDirectory v=20200 size=12461 flags=0x0 (none) hashes=616+3 location=embedded
Hash type=sha1 size=20
CDHash=d1c12c783dac0e8d9a2b749fb896b11558cec8b6
Signature size=8532
Authority=Developer ID Application: XXXXX
Authority=Developer ID Certification Authority
Authority=Apple Root CA
Timestamp=29 jul. 2015 12;04:40
Info.plist 条目=8
TeamIdentifier=YYYYY
密封资源版本=2 规则=12 文件=10
内部要求计数=1 大小=180
这似乎没问题。
跑步
$ spctl -a -t exec -vv MyApp.app
在所有二进制文件上给出的结果
MyApp.app:接受
来源=开发者 ID
来源=开发者 ID 应用程序:XXXX
这似乎也不错
在应用程序或应用程序文件夹内的二进制文件上运行 XCode 命令行工具检查签名:
$ ./check-signature /Users/xxx/trunk/yyy/release/MyApp.app
结果给出
(c) 2014 Apple Inc. 保留所有权利。
是的
这在所有情况下都是期望的结果。
但是GateKeeper仍然不接受该应用程序并抱怨无法确认开发者的事实。
[作者于 2015 年 7 月 17 日星期五添加]
我想我找到了问题所在。我不知道它是一个功能还是一个 OSX 错误。stackoverflow问题 19551298帮助了我很多。
每当从 Internet 下载文件时,它都会获得与其关联的扩展文件属性 com.apple.quarantine。在 Finder 中双击这个下载的文件时,GateKeeper 有两种可能:
当文件未签名时,它会发出“Unidentified developer etc”消息
当文件经过数字签名时,它会发出“无法确认开发人员等”消息
在这两种情况下,MessageBox 都只有一个按钮,即确定按钮。单击此按钮时,除了 MessageBox 关闭之外,没有任何反应。
如果扩展属性被删除(xattr -d)应用程序运行,签名与否。
当应用程序通过在应用程序上的 Finder 中单击鼠标右键然后单击“打开”菜单操作来启动应用程序时,行为会有所不同。再次显示两个消息框之一,但现在有一个额外的按钮,允许用户无论如何打开应用程序。同样,签名和未签名之间的唯一区别是“未识别”或“未确认”消息。我不希望我的客户能够分辨出不同之处。因此,签署应用程序是徒劳的。
根据Apple 支持文档,我期望在双击下载的应用程序时 GateKeeper 的另一个更好的行为(可能文档已经过时,或者我误读了它):
如果应用程序已签名,GateKeeper 应该显示一个带有“从互联网等下载”的消息框和一个带有“仍然继续?”的按钮。
如果应用程序未使用单个确定按钮和文本“未识别的开发人员等”签署 MessageBox。