Mac OS Gatekeeper阻止签名命令行工具

时间:2016-10-01 21:51:05

标签: xcode macos code-signing

我有一个"命令行工具" Xcode中被Gatekeeper阻止的目标(不是应用程序包)。我多年来一直使用这个工具作为PostCheck地址簿插件的简单安装程序。

2012年,我使用Apple开发者ID对该工具进行了签名,这样它就不会被Gatekeeper阻止,一切都很好。我现在已经注意到macOS Sierra(10.12)它现在被阻止了,在测试过程中我也发现它也被10.11.6阻止了。 (当我说阻止时,我的意思是用户必须右键单击它并选择'打开'而不是在警告对话框中给出选项。)它仍然可以正常使用10.11.2! - 如果我记得,Mac OS X 10.11.4有一个阻止非应用程序包的错误,即使它们已经签名,但我认为这个问题已在10.11.5中得到修复。也许它有关系?

我尝试使用Sierra下的Xcode 8重新编译和重新签名可执行文件。我尝试在二进制文件中嵌入一个Info.plist(之前我没有做过)。我尝试过归档而不仅仅是"建立"如果是调试与发布配置的问题。我花了两天的时间搜索验证我的可执行文件的方法是否正确签名,看似结果相互矛盾...

有这个:

codesign --verify --verbose <executable> 
<executable>: valid on disk
<executable>: satisfies its Designated Requirement

而且:

spctl --assess --verbose <executable> 
<executable>: rejected (the code is valid but does not seem to be an app)
source=matched cdhash

而且:

spctl -a -v --raw <executable> 
<executable>: accepted
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>assessment:authority</key>
    <dict>
        <key>assessment:authority:flags</key>
        <integer>0</integer>
        <key>assessment:authority:source</key>
        <string>allowed cdhash</string>
        <key>assessment:authority:weak</key>
        <true/>
    </dict>
    <key>assessment:cserror</key>
    <integer>-67002</integer>
    <key>assessment:remote</key>
    <true/>
    <key>assessment:verdict</key>
    <true/>
</dict>
</plist>

我认为我的部分问题是,在使用有效的Apple Developer ID签名后,我不知道命令行可执行文件应该是什么样子。而且我也不知道它是否是一个我无法解决的macOS问题。 Google对于命令行工具和代码签名问题也非常困难,并找到与代码签名命令行Unix可执行文件实际相关的内容。

我很欣赏任何有关此处可能发生的事情的见解。谢谢!

3 个答案:

答案 0 :(得分:2)

我讨厌回答我的问题,但万一有人遇到同样的问题:

解决方案是将命令行工具分发到已签名的磁盘映像而不是zip文件中。

我最终测试回到10.11.4,并在麻烦开始时确认了。 (当时我必须对它进行不正确的测试。)OS X只是阻止双击Unix命令行工具,无论我如何签名。它可能是最好的,因为大多数命令行工具都将从Terminal.app。

中运行

对于Sierra来说,事实证明我需要签名的DMG才能绕过关守的新路径随机化功能。

答案 1 :(得分:0)

当我与go-astilectron-bundler捆绑销售时,我遇到了同样的问题

        $imageFoo = '
        <div id="' . $uniqueId . '"
             style="
                background-image: url(//foo.lall/image.png);
                -webkit-background-size: contain;
                -moz-background-size: contain;
                -o-background-size: contain;
                background-size: contain;
                background-position: center;
                background-repeat: no-repeat;
             "
        ></div>
        <!-- this is a helper, only needed because "background-image" did not fire a "onerror" event -->
        <img style="display: none;" 
             src="//foo.lall/image.png" 
             onerror="var fallbackImages = $(this).data(\'404-fallback\'); $(\'#' . $uniqueId . '\').css(\'background-image\', \'url(\' + fallbackImages + \')\');"
             data-404-fallback="//foo.lall/image_fallback.png"
        >
        ';

Info.plist 文件解决了该问题。

答案 2 :(得分:0)

macOS Catalina 10.15.3和更早版本(已在10.15.4中修复)中存在一个已知的错误,其中一个经过公证的命令行应用程序链接到其捆绑包之外的.dylib(并且通常不在捆绑包中) )将仍然无法使Gatekeeper检查在命令行可执行文件上设置quarantine **标志时触发的触发器。

要解决此问题,Apple DTS建议:

最简单的解决方法是同时使用强化的运行时和库验证标志对工具进行签名。

也就是说,从此更改对codesign的调用:

% codesign -s …stuff… -o runtime …stuff… helloworld

对此:

% codesign -s …stuff… -o runtime,library …stuff… helloworld

显式设置库标志将禁用此Gatekeeper检查,并允许您的工具在macOS 10.15。{0,1,2,3}上运行。一旦发布10.15.4并被广泛采用,请记下该标记以删除该标记。

**根据https://eclecticlight.co/2019/10/24/airdrop-and-quarantine-flags/

,只要您通过互联网下载或AirDrop(而不是通过网络文件共享或iCloud Drive)接收到文件,就会设置隔离标记。