Gatekeeper拒绝我的应用程序包

时间:2016-11-14 21:39:20

标签: macos signature signing codesign

我对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; (以及为什么)?

当我在此处检查错误代码时:https://github.com/CamJN/Security/blob/77b26b3e434caec74403da43bcfb02532a25d7ff/libsecurity_codesigning/lib/CSCommon.h

我明白了:

errSecCSWeakResourceRules =         -67013, /* resource envelope is obsolete */
errSecCSBadFrameworkVersion =       -67009, /* embedded framework contains modified or invalid version */

EDIT2:我的Frameworks文件夹的内容确实导致了问题。当我在签名之前删除所有内容时,它会通过spctl验证。

问题是,如果我只让一个单一的纯框架,如QtCore(来自Qt 5.7.0),我立即得到了spctl错误:

  

被拒绝(嵌入式框架包含已修改或无效的版本)

1 个答案:

答案 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必须替换为您自己的,自签名/自行生成的证书的名称)