如何调试 OSX 代码签名拒绝?

Posted

技术标签:

【中文标题】如何调试 OSX 代码签名拒绝?【英文标题】:How to debug OSX code signing rejection? 【发布时间】:2015-03-22 21:30:06 【问题描述】:

我正在为 OSX 签署 install4j 安装程序,但 OSX 拒绝了它。系统日志只报告被拒绝,spctl只报告被拒绝,没有任何解释。我如何确定它被拒绝的原因?

【问题讨论】:

【参考方案1】:

我想您是在谈论 Gatekeeper 不允许您的应用在下载后运行? Gatekeeper 的规则不是基于拒绝应用程序的规则列表,而是基于接受应用程序的可能规则列表,如果您的应用程序不匹配任何或那些规则.这使得很难记录例如除了“它不符合任何允许规则”之外,为什么您的应用被拒绝了。现在,如果您知道您希望对其应用哪个“允许”规则,您可以尝试基于此进行调试,但 Gatekeeper 本身并不知道这一点,因此没有多大帮助。

我假设您希望您的应用符合“已识别开发者”规则?如果是这样,有几个测试来寻找明显的问题:首先,运行codesign -vv --deep-verify /path/to/yourapp.app,并确保它打印“磁盘上有效”和“满足其指定要求”(并且没有给出任何错误)——如果不是,说明签名或应用内容有问题。

其次,运行codesign -dvv /path/to/yourapp.app,并确保它列出的数据包括:

Authority=Developer ID Application: [Your name/company here]
Authority=Developer ID Certification Authority
Authority=Apple Root CA
Sealed Resources version=2 rules=[something] files=[something]

如果授权列表与此不同,则您使用了错误的证书对其进行签名。如果 Sealed Resources 版本为 1 或未列出,则表明您使用旧版本的 OS X 对其进行了签名,最新版本将拒绝该签名格式。

【讨论】:

在运行codesign --verify 时,我建议同时使用--deep-verify 选项,以确保所有插件、私有框架等也正确签名。 @JWWalker 好主意;我已将其添加到我的答案中。 你能澄清一下关于权限列表的内容吗?文档apple.co/1BMv0Te 说“如果您的公司已经拥有用于在其他系统上签署代码的第三方签名身份,则可以将其与 OS X 的 codesign 命令一起使用”。这样的证书不包括“Apple Root CA”。或者这个权威列表是别的什么? @user1009908 您可以使用任何代码签名证书进行签名,但 Gatekeeper 的默认规则仅允许使用 Apple Developer ID 证书签名的应用。这样做的原因是,Apple 希望能够撤销任何被发现签署恶意软件的人的证书,而他们只有在他们是颁发机构的情况下才能这样做。 谢谢你,这真的帮助了我!我试图在 10.8 系统上进行协同设计,尽管协同设计表明成功,但 Gatekeeper 仍然阻止它。关键是 Sealed Resources 行——只有在 10.9 系统上进行代码设计后,它才读作 Sealed Resources version=2。当然,Apple 几乎不会考虑任何不使用最新操作系统版本的人,而且我在他们的文档中的任何地方都没有发现这个警告。谢谢你拯救我的理智!

以上是关于如何调试 OSX 代码签名拒绝?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Adob​​e AIR SDK 的 OSX 应用程序代码签名证书

OSX 上 Apple Sandbox 的代码签名助手应用程序

iOS - 拒绝代码签名权限,现在无法构建

代码签名框架失败,出现“权限被拒绝”错误

如何检查 APK 是不是已签名或“调试构建”?

应用程序代码签名失败并出现错误“代码对象根本没有签名”