首页 文章

Gatekeeper 拒绝我的应用程序包

提问于
浏览
2

我对 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/>

现在我不知道该相信什么,是“嵌入式框架包含修改或无效版本”还是“过时的资源包络”(以及为什么)?

当我在这里检查错误代码时: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 文件夹的内容确实导致了问题。当我在签名之前删除所有内容 in-there 时,它会通过 spctl 验证。

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

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

1 回答

  • 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 接受 self-signed 证书的命令(当你没有 Apple Developer ID 但需要针对 spctl 进行测试时很有用):

    spctl --add --requirement "certificate leaf[subject.CN] = \"MY CERTIFICATE\"" --label "MyCustomCertificate"
    

    (其中我的证书必须替换为您自己的证书,self-signed/self-generated 证书)

相关问题