Gatekeeper隔离证书问题

时间:2016-06-13 13:41:44

标签: macos code-signing

我们的应用已经过代码签名。我们的Apple证书是最新的。我们的应用程序的早期版本运行得很好。

但是,当用户下载DMG时,在某些Mac上应用程序会被隔离,但对于大多数用户来说,它并非如此。因此,一些用户可以打开应用程序,而其他用户则无法打开" X.app无法打开,因为无法确认开发人员的身份。"

幸运的是,我在这里有2台有隔离问题的Mac,但我们无法找到这些Mac与其他Mac之间的区别。还有其他人遇到过这个问题吗?

2 个答案:

答案 0 :(得分:4)

我认为您可能对隔离,代码签名和Gatekeeper的工作方式感到困惑。您看到的错误来自Gatekeeper,表示两种不同(且独立)的事情:1)应用程序被隔离(与下载方式有关,而不是如何签名)和2 )它的签名方式不符合Security& S中定义的Gatekeeper策略。隐私偏好。让我更详细地解释这两件事。

  • 隔离是应用程序(或其所在的磁盘映像)下载的结果。使用浏览器下载文件时,浏览器会向其附加com.apple.quarantine属性,表明它来自不受信任的网络源。其他类型的互联网应用程序(电子邮件,聊天等)也应该将此属性附加到下载的文件中。

    但并非所有网络下载方法都会应用隔离属性。例如,通过Finder通过文件共享连接(例如AFP或SMB)复制文件不会将其标记为隔离。此外,curlwget等命令行工具也不会应用隔离区。

    在您的情况下,当您下载.dmg文件时,它会被标记为已隔离;当您打开它时,该属性会传播到其内容,因此该应用程序也会被标记为处于隔离状态(如果您将其复制到/ Applications,则会将隔离属性与其他所有内容一起复制)。

    要检查文件是否已隔离,请在其上使用ls -l@并查找com.apple.quarantine属性。完全可能的是,您在不同计算机之间看到的差异与磁盘映像的下载方式有关,因此是否隔离了应用程序。

  • 当您打开隔离的应用程序时,Gatekeeper会检查它是否符合您计算机的安全策略子系统。 是进入代码签名的地方。您可以在系统偏好设置 - >中查看和更改您的政策。安全与安全隐私窗格 - >常规标签 - > "允许从"或使用spctl命令行工具。默认策略是允许来自Mac App Store的隔离应用程序(即使用Apple的应用程序商店密钥签名)或来自已识别的开发人员(即使用Apple颁发的开发者ID密钥签名给注册开发人员)。

    当您尝试打开已被隔离且以符合此政策的方式签名的应用时,您会收到错误消息,说明" X.app无法被打开,因为它来自一个身份不明的开发者"或者" ...未从Mac App Store下载。"如果它已被隔离但 符合该政策,则会收到一条消息:" X.app是从互联网下载的应用程序。你确定要打开吗?" (有一个打开按钮可用)。如果未隔离,则不会执行检查,直接打开应用程序。

    您可以使用spctl --assess -vv /path/to/X.app获取有关应用程序的代码签名和策略状态的更多信息(它将告诉您它是否符合关守策略)和codesign -dvv /path/to/X.app

总之,隔离是正常的,您应该希望您的用户体验它(如果您在某台测试计算机上没有看到它,那么您的使用方式有问题吗?测试)。 Gatekeeper错误取决于正确的签名(使用codesignspctl计算机上的Gatekeeper策略设置;检查两者以查看正在进行的操作。

答案 1 :(得分:2)

Gordon Davissons的答案相当广泛,在大多数情况下都应该有所帮助。就我而言,它没有。

除了他提到的两个网守错误消息之外,还有第三个,这是你问题中的一个:

“。app无法打开,因为无法确认开发者的身份。”

在我的情况下,当嵌入式第三方框架的运行路径设置错误时,会出现此消息:构建设置中的Data source name not found and no default driver specified 确实引用了不允许的内容。

Apple在此处记录https://developer.apple.com/library/content/technotes/tn2206/_index.html#//apple_ref/doc/uid/DTS40007919-CH1-TNTAG207

  

如果应用使用@rpath或绝对路径链接到动态库   在应用程序之外,该应用程序将被Gatekeeper拒绝。

他们甚至说:

  

协同设计和spctl工具都不会显示错误。错误   只会出现在系统日志中。

解决方案是将第三方框架修改为这样的标准:

LD_RUNPATH_SEARCH_PATHS