【发布时间】:2015-07-29 19:06:21
【问题描述】:
我用 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
标识符=aaaa.MyApp
格式=捆绑 Mach-O 瘦 (x86_64)
CodeDirectory v=20200 size=12461 flags=0x0(none) hashes=616+3 location=embedded
哈希类型=sha1 大小=20
CDHash=d1c12c783dac0e8d9a2b749fb896b11558cec8b6
签名大小=8532
授权=开发者 ID 申请:XXXXX
Authority=开发者 ID 证书颁发机构
授权=Apple 根 CA
时间戳=7 月 29 日。 2015 12;04:40
Info.plist 条目=8
团队标识符 = YYYYY
密封资源版本=2 规则=12 文件=10
内部要求 count=1 size=180
这看起来不错。
跑步
$ spctl -a -t exec -vv MyApp.app
在 所有 二进制文件中给出结果
MyApp.app:已接受
来源=开发者 ID
origin=开发者ID申请:XXXX
看起来也不错
运行 XCode 命令行工具 check-signature
在应用程序或应用程序文件夹内的二进制文件上:
$ ./check-signature /Users/xxx/trunk/yyy/release/MyApp.app
给出结果
(c) 2014 Apple Inc. 保留所有权利。
是的
在所有种情况下都是期望的结果。
但GateKeeper仍然不接受该应用程序并抱怨无法确认开发者的事实。
[作者于 2015 年 7 月 17 日星期五添加]
我想我找到了问题所在。我不知道它是一个功能还是一个 OSX 错误。 stackoverflow question 19551298 给了我很多帮助。
每当从 Internet 下载文件时,它都会获得一个与之关联的扩展文件属性 com.apple.quarantine。在 Finder 中双击这个下载的文件时,GateKeeper 有两种可能:
当文件未签名时,它会发出“Unidentified developer etc”消息
对文件进行数字签名后,会发出“无法确认开发人员等”消息
在这两种情况下,MessageBox 都只有一个按钮,一个确定按钮。单击此按钮时,除了 MessageBox 关闭之外,没有任何反应。
如果扩展属性被删除(xattr -d)应用程序运行,签名与否。
通过在应用程序上的 Finder 中单击鼠标右键然后单击“打开”菜单操作来启动应用程序时,行为会有所不同。再次显示两个消息框之一,但现在有一个额外的按钮,允许用户无论如何打开应用程序。同样,签名和未签名之间的唯一区别是“未识别”或“未确认”消息。我不希望我的客户能够分辨出不同之处。因此,签署应用程序是徒劳的。
在Apple Support Documentation 的基础上,我希望在双击下载的应用程序时,GateKeeper 会有另一个更好的行为(可能文档已经过时,或者我看错了):
如果应用程序已签名,GateKeeper 应显示一个带有“从互联网等下载”的消息框和一个带有“仍然继续?”的按钮
如果应用程序未签署带有单个确定按钮和文本“未识别的开发人员等”的 MessageBox。
【问题讨论】:
-
您是在您的机器上收到 GateKeeper 错误消息,还是仅在用户机器上收到?你运行的是什么版本的 Mac OS X?什么版本的 Xcode?span>
-
@JWWalker 如果我使用普通帐户登录,我不会收到 GateKeeper 消息。当我以其他用户身份登录时,我确实得到了它。产生差异的原因是 Gatekeeper 为每个用户保留一份豁免清单。我还在客户的机器上收到警告消息。我正在运行 OSX Yosemite 10.10.4。 Xcode 6.4。我没有使用 Xcode 进行开发。我只是用来导出我的开发者证书。
标签: xcode macos cocoa code-signing osx-gatekeeper