证书的网守检疫问题

Posted

技术标签:

【中文标题】证书的网守检疫问题【英文标题】:Gatekeeper quarantine issue with certificate 【发布时间】:2016-06-13 13:41:44 【问题描述】:

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

但是,当用户下载 DMG 时,在某些 Mac 上应用程序会被隔离,但对于大多数用户而言,并非如此。所以有些用户可以打开应用,有些用户却得到“无法打开X.app,因为开发者身份无法确认。”

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

【问题讨论】:

【参考方案1】:

我认为您可能对隔离、代码签名和 Gatekeeper 的工作方式有些困惑。您看到的错误来自 Gatekeeper,表示两个不同(且独立)的事情:1)应用程序已被隔离(与下载方式有关,与签名方式无关)和 2)未登录一种符合安全和隐私首选项中定义的关守策略的方式。让我更详细地解释这两件事。

隔离是下载应用(或其所在的磁盘映像)的结果。当你用浏览器下载一个文件时,浏览器会给它附加一个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 是从 Internet 下载的应用程序。您确定要打开它吗?” (带有可用的“打开”按钮)。如果没有被隔离,则不进行检查,直接打开应用。

您可以通过spctl --assess -vv /path/to/X.app(它会告诉您它是否符合Gatekeeper 政策)和codesign -dvv /path/to/X.app 获得有关应用程序的代码签名和政策状态的更多信息。

总之,隔离是正常的,您应该期望您的用户能够体验到它(如果您在其中一台测试计算机上没有看到它,那么您的测试方式有问题)。 Gatekeeper 错误取决于正确的签名(检查codesignspctl计算机上的 Gatekeeper 策略设置;检查两者以了解发生了什么。

【讨论】:

感谢您的详细回复。所有工具都表明该应用程序确实已签名。这是我使用每个选项得到的结果(应用名称和团队 ID 已更改)... $ spctl --assess -vv MyApp.app MyApp.app: 接受源=开发者 ID origin=开发者 ID 应用程序:RT Ltd. (ABCDEF1234) $ codedesign --verify --deep --verbose =2 MyApp.app MyApp.app:在磁盘上有效 MyApp.app:满足其指定要求 @user3140551:我的想法不多了,但这里还有一些:codesign -dvv 是否显示“密封资源版本=2”?如果不是,则签名是过时的格式。此外,您的应用程序是否使用任何未签名/未正确签名的依赖项(框架等)?有关示例,请参见 this question... 我明白了:密封资源版本=2 规则=12 文件=294,我相信依赖项已签名。没有警告。我们正处于一个新的开发周期中,所以我们将回到新版本的问题上。感谢您的帮助,我已为该链接添加了书签。如果我们在此期间弄清楚,我会发布答案。【参考方案2】:

Gordon Davissons 的回答非常广泛,在大多数情况下应该会有所帮助。在我的情况下,它没有。

除了他提到的两个看门人错误消息之外,还有第三个,那就是您的问题:

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

在我的情况下,当嵌入式第三方框架的运行路径设置错误时出现此消息:构建设置中的LD_RUNPATH_SEARCH_PATHS 确实引用了不允许的内容。

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

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

他们甚至声明:

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

解决方案是将第三方框架修改为如下标准:

$(inherited) @executable_path/../Frameworks @loader_path/Frameworks

【讨论】:

以上是关于证书的网守检疫问题的主要内容,如果未能解决你的问题,请参考以下文章

nginx下如何配置 ssl证书?腾讯云ssl证书为例!

自己生成的ssl证书与购买的ssl证书区别在哪里?

给微信小程序选一个ssl证书,怎么选?免费证书可以吗?

客户叫我提供C I Q Certificate是啥意思呢?

微信小程序合法域名校验错误 ssl测试证书可以吗

SSL证书:Web加密使互联网更安全