签署OSX 10.9的框架

koa*_*oan 17 macos qt code-signing

使用后macdeployqt我签署我的应用程序,以避免Gatekeeper问题.

我可以使用codesign所有框架和捆绑包内的所有内容,但是当我来签署捆绑包时,我收到一个错误:

$ codesign --force --verify --verbose --sign "Developer ID Application: My ID" MyApplication.app
MyApplication.app: bundle format unrecognized, invalid, or unsuitable
In subcomponent: /Users/username/Dev/Apps/MyApplication/MyApplication.app/Contents/Frameworks/QtConcurrent.framework
Run Code Online (Sandbox Code Playgroud)

如果我检查签名:

$codesign -vvv MyApplication.app/Contents/Frameworks/QtConcurrent.framework/Versions/5/QtConcurrent 
MyApplication.app/Contents/Frameworks/QtConcurrent.framework/Versions/5/QtConcurrent: valid on disk
MyApplication.app/Contents/Frameworks/QtConcurrent.framework/Versions/5/QtConcurrent: satisfies its Designated Requirement
Run Code Online (Sandbox Code Playgroud)

根据http://furbo.org/2013/10/17/code-signing-and-mavericks/,似乎我应该签署类似这样的框架包

$ codesign --force --verify --verbose --sign "Developer ID Application: My ID" MyApplication.app/Contents/Frameworks/QtConcurrent.framework/Versions/5
Run Code Online (Sandbox Code Playgroud)

但这会导致

MyApplication.app/Contents/Frameworks/QtConcurrent.framework/Versions/5: bundle format unrecognized, invalid, or unsuitable
Run Code Online (Sandbox Code Playgroud)

Ben*_*anc 19

今天早上得到了同样的错误.在OSX 10.9上,codesign应用程序似乎更严格

问题是由macdeployqt没有将Qt框架包的info.plist文件复制到应用程序包中引起的.

您可以通过告诉脚本手动将文件复制到嵌入式框架的捆绑文件中来解决此问题.

例如

$ cp ~/Qt5.2.0/5.2.0-beta1/clang_64/lib/QtCore.framework/Contents/Info.plist MyApplication.app/Contents/Frameworks/QtCore.framework/Resources/
Run Code Online (Sandbox Code Playgroud)

为您的应用程序使用的每个qt模块执行此操作,在调用macdeployqt*之后,但在调用codesign之前.(*或mkdir目标目录)

此外,在框架的文件夹上调用codesign,而不是在版本子文件夹上.

$ codesign --force --verify --verbose --sign "Developer ID Application: My ID" MyApplication.app/Contents/Frameworks/QtConcurrent.framework
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.


acr*_*nce 7

摘要

  1. 通过将Info.plist移动​​到框架中当前版本级别的Resources文件夹来修复格式错误的Qt框架.
  2. 使用codesign --deep选项一次签名包中的所有二进制文件,包括框架和插件.

细节

解决此问题的最简单方法是使用--deep codesign选项.这个选项(我认为是Mavericks引入的)将签署目标包中的所有二进制文件,包括主应用程序二进制文件及其框架和插件.

但是在使用此选项(或任何其他建议的签名技术)之前,您必须按照此线程上的其他帖子修复Qt框架.由于一些奇怪的原因,构建的Qt框架不符合Apple的框架规范,并且会混淆代码签名工具.这反过来可能导致不良行为,例如将框架的顶级符号链接替换为已签名框架二进制文件的附加副本.

要修复Qt框架,您应该将Info.plist复制到特定版本框架中的Resources文件夹,而不是框架的顶层(如先前所建议的那样).此外,您可能希望在应用程序包框架中丢弃Info.plist的原始副本,因为它基本上位于错误的位置.

具体来说,你应该做这样的事情来根据需要修复每个框架:

mkdir -p MyKillerApp.app/Contents/Frameworks/QtCore.framework/Versions/Current/Resources
cp lib/QtCore.framework/Contents/Info.plist MyKillerApp.app/Contents/Frameworks/QtCore.framework/Versions/Current/Resources
rm -rf MyKillerApp.app/Contents/Frameworks/QtCore.framework/Contents
Run Code Online (Sandbox Code Playgroud)

以上假设框架中存在"Versions/Current"符号链接.我认为所有构建的Qt库都是这种情况.但是,如果您的构建不是这种情况,那么您可以使用特定版本文件夹名称(如"4")而不是"当前"符号链接.

规范化框架后,您可以使用--deep选项对应用程序包中的所有二进制文件进行签名:

codesign --deep --force --verify --sign "Developer ID Application: My ID" MyKillerApp.app
Run Code Online (Sandbox Code Playgroud)

或者,如果您已在项目级别启用了代码签名以进行部署后处理,则只需在"其他代码签名标志"中传递--deep选项:

OTHER_CODE_SIGN_FLAGS = --deep
Run Code Online (Sandbox Code Playgroud)

如果您对主应用程序的代码签名要求与框架或插件的要求不同,则可以使用一些技巧.首先,使用frameworks/plugins要求使用--deep选项进行签名.然后,您可以使用--force选项再次签名,但不使用--deep选项,指定应用程序级别要求.结果将是主应用程序将使用应用程序要求进行签名,并且所有子二进制文件将使用框架/插件要求进行签名.

这种方法可能被认为有点懒惰和浪费,因为您要对主应用程序签名两次.但它比从主应用程序二进制文件中分别查找和签署所有子二进制文件的方法更简单.