【发布时间】:2016-10-01 21:51:05
【问题描述】:
我在 Xcode 中有一个被 Gatekeeper 阻止的“命令行工具”目标(不是 App 包)。多年来,我一直使用这个工具作为我的 PostCheck 地址簿插件的简单安装程序。
在 2012 年,我使用我的 Apple Developer 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 开发人员 ID 签名后应该是什么样子。而且我也不知道这是否是我无能为力的 macOS 问题。对于命令行工具和代码签名问题,Google 也很难找到与命令行 Unix 可执行文件的代码签名相关的内容。
感谢您对这里可能发生的事情的任何见解。谢谢!
【问题讨论】:
-
尝试使用
--strict选项和codesign。另外,请尝试将-t open选项与spctl一起使用,因为双击可执行文件并不会真正直接执行它,它会将其作为文档传递给终端,而终端将路径作为命令执行。这可能会解决“似乎不是应用程序”的问题。您还可以多次指定-v以增加详细程度。使用--ignore-cache只是为了确保您正在评估文件是新鲜的。 -
FWIW,错误 cserror -67002 是 errSecCSNotAppLike(这可能不是一个大惊喜)。我通过创建一个包含命令行工具的应用程序包并签署该包来“修复”这个问题。然后我可以运行命令行工具,只需将其引用为 foo.app/Contents/MacOS/foo。不是很好的用户体验,但可以满足我的需求。
标签: xcode macos code-signing