我对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
我得到了:
在磁盘上有效 满足其指定要求
这是预期的有效结果。
当我做codeign -dv --verbose = 4 PATHTOAPP时,我得到:
Authority =开发者ID应用程序:MYAPPLEID Authority =开发者ID 证书颁发机构颁发机构= Apple Root CA
密封资源版本= 2
当我针对Apple提供的支票签名工具运行时,我得到一个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/>
现在我不知道该相信什么,它是什么&#34;嵌入式框架包含修改或无效版本&#34;或者它是过时的资源包络&#34; (以及为什么)?
我明白了:
errSecCSWeakResourceRules = -67013, /* resource envelope is obsolete */
errSecCSBadFrameworkVersion = -67009, /* embedded framework contains modified or invalid version */
EDIT2:我的Frameworks文件夹的内容确实导致了问题。当我在签名之前删除所有内容时,它会通过spctl验证。
问题是,如果我只让一个单一的纯框架,如QtCore(来自Qt 5.7.0),我立即得到了spctl错误:
被拒绝(嵌入式框架包含已修改或无效的版本)
答案 0 :(得分:1)
原来每个框架的内容都错过了FRAMEWORK.framework / Versions / Current符号链接
必需的符号链接:
FRAMEWORK.framework/Resources
FRAMEWORK.framework/Versions/Current
创建符号链接的简易脚本(在Frameworks文件夹中):
find . -path '*.framework/Versions/[0-9]' -and -not -type l -print0 | while read -d $'\0' FRMPATH
do
ln -s ${FRMPATH/*framework\//}/Resources $FRMPATH/../../Resources
ln -s ${FRMPATH/*Versions\//} $FRMPATH/../Current
done
我还发现了一个命令,使Gatekeeper接受自签名证书(当你没有Apple Developer ID但需要针对spctl进行测试时很有用):
spctl --add --requirement "certificate leaf[subject.CN] = \"MY CERTIFICATE\"" --label "MyCustomCertificate"
(其中MY CERTIFICATE必须替换为您自己的,自签名/自行生成的证书的名称)