我对 Apple 签名系统感到困惑。它让我疯了。
我有一个 Qt 应用程序(所以不通过 XCode 生态系统)我在 macOS 10.12 上手动签名。
签名后,按照此处的建议运行 codesign --verify --deep --strict --verbose=2 PATHTOAPP:https://developer.apple.com/library/content/technotes/tn2206/_index.html#//apple_ref/doc/uid/DTS40007919-CH1-TNTAG211
我得到:
在磁盘上有效满足其指定要求
这是预期的有效结果。
当我做代码签名-dv --verbose=4 PATHTOAPP 时,我得到:
Authority=Developer ID 应用程序:MYAPPLEID Authority=Developer ID
证书颁发机构 Authority=Apple 根 CA.
密封资源 version=2
当我针对 Apple 提供的 check-signature 工具运行它时,我得到一个 YES 意味着它已正确签名。
但是当我针对 spctl -a -t exec -vv PATHTOAPP 运行它时,我得到一个:
拒绝(嵌入式框架包含修改或无效的版本)
最后,Gatekeeper 拒绝我的应用程序
不幸的是,spctl 实用程序并没有给我一个关于什么是错误以及在哪里查看的线索。我不明白,因为用最深和最严格的旗帜进行编码表示没问题。
有关如何获取更多信息的任何想法?
**EDIT1:**我运行了 spctl --assess --raw --verbose PATHTOAPP,我得到了这个:
<key>assessment:authority</key>
<dict>
<key>assessment:authority:flags</key>
<integer>0</integer>
<key>assessment:authority:source</key>
<string>obsolete resource envelope</string>
<key>assessment:authority:weak</key>
<true/>
</dict>
<key>assessment:cserror</key>
<integer>-67009</integer>
<key>assessment:remote</key>
<true/>
<key>assessment:verdict</key>
<false/>
现在我不知道该相信什么,是“嵌入式框架包含修改或无效版本”还是“过时的资源包络”(以及为什么)?
我知道了:
errSecCSWeakResourceRules = -67013, /* resource envelope is obsolete */
errSecCSBadFrameworkVersion = -67009, /* embedded framework contains modified or invalid version */
**EDIT2:**我的 Frameworks 文件夹的内容确实导致了问题。当我在签名之前删除所有内容 in-there 时,它会通过 spctl 验证。
问题是,如果我只让一个单独的纯框架,如 QtCore(来自 Qt 5.7.0),我立即得到 spctl 错误:
拒绝(嵌入式框架包含修改或无效的版本)
1 回答
原来每个框架的内容都错过了 FRAMEWORK.framework/Versions/Current 符号链接
必需的符号链接:
简单的脚本来创建符号链接(在 Frameworks 文件夹中):
我还发现了一个使 Gatekeeper 接受 self-signed 证书的命令(当你没有 Apple Developer ID 但需要针对 spctl 进行测试时很有用):
(其中我的证书必须替换为您自己的证书,self-signed/self-generated 证书)