我们有一套多平台的命令行可执行文件和库,可以移植到Mac。文件布局为
- /应用程序/
- (公司文件夹(/
- (我们的UI(.app
- (产品名称(/
- bin/
- 。。。可执行文件
- lib/
- 。。。dylibs
- (其他东西(/
- bin/
- (公司文件夹(/
这是在一个代码签名的DMG中提供的,应用程序也是如此。这在Catalina之前还可以。
现在在Catalina上,我们已经对所有可执行文件、dylib、应用程序(包括嵌套在顶级应用程序框架中的应用程序(、框架和DM本身进行了代码签名。当我们对其进行公证时,生成的JSON日志没有列出任何问题。但是,当我运行任何依赖于dylib的可执行程序时,我会收到一个弹出窗口,告诉我"无法识别开发人员"。即使它已经签名和公证OK。使用-dvvv选项运行代码签名包括以下内容:
- SHA-256哈希选择
- 终止于Apple Root CA的授权机构条目列表
- TeamIdentifier条目
- 时间戳
- 运行时间:10.13.0
问题我该如何解决此问题,或者至少让Gatekeeper告诉我为什么不接受此文件?也许是一个日志,或者相当于spctl——评估文件而不是应用程序?
观测
- 只有当
- 操作系统是Catalina
- 它在/Applications文件夹下
- 在/Applications之外(例如在桌面上的文件夹中(,这种情况只会偶尔发生(有时它声称第一次尝试时无法加载dylib,稍后尝试则会成功(
- 可执行文件依赖于一个或多个dylib(独立的运行正常(
- 可执行文件具有com.apple.identity xattr集
- 我曾尝试在clean和downloaded之间混合"匹配(即隔离xattr'd文件(,只有当可执行文件被隔离时,问题才会出现;它不在乎一个未隔离的可执行文件是否加载了一个经过验证的dylib
- 签名操作是通过带有参数"--deep-strict--timestamp--options runtime"的代码签名完成的,然后进行验证
- 编辑:我已经更新了它,包括一些硬化运行时权限,以修复另一个构建问题,但它对这个问题没有帮助
- 可执行文件依赖于通过@rpath的dylib(如otool-L所报告的(
- 编辑:我试过用@executable_path/..替换@rpath/在每种情况下都是lib,但这并没有帮助
还有一个苹果没有添加到文档中的花絮;如果你分发的是一个dylib,而不是一个完整的应用捆绑包,你就不能将公证结果装订在上面。到目前为止,已经有了相关文档,Catalina应该在安装软件时在线验证公证。
但是,经过公证的dylib将在构建机器上被拒绝,除非您将其添加到容器(即zip/dmg(中,删除原始副本,然后在公证被完全接受后再次从zip中提取(即您已收到成功电子邮件(。似乎只有在创建文件时才会检查注释。
您可以始终在XCode中运行它,但不能单独运行,而无需删除和替换二进制文件。