我有一个应用程序(使用 Qt / QML 构建),我正在尝试对其进行签名和公证,以便在 App Store 之外进行临时分发(供公司内部使用)。Apple 确认我的软件已经过公证,然后我装订了我的 .app - 但 Gatekeeper 仍然阻止应用程序运行并提醒用户:
无法打开App Name ,因为 Apple 无法检查其是否存在恶意软件。
我究竟做错了什么?.
以下是我正在遵循的步骤:
在 Qt Creator 中运行 QMake / Build。
将生成的 Info.plist 文件中的 CFBundleIdentifier 键修改为 com. 我的公司名称。appName而不是 com.yourcompany。由 Qt 生成的appName 。
cd
到我的构建目录。冉macdeployqt
/Users/<user>/Qt/5.13.0/clang_64/bin/macdeployqt <appName>.app -qmldir=<project source code dir>
:。代码签名:(
codesign --deep -f -s "Developer ID Application: <company name> (<team id>)" --options "runtime" "<appName>.app/"
其中开发人员 ID 应用程序是出现在 KeychainAccess 中的名称)。验证签名:
codesign -dv --verbose=4 <appName>.app
返回:`Executable=<build dir>/<app name>.app/Contents/MacOS/<app name> Identifier=com.<company name>.<app name> Format=app bundle with Mach-O thin (x86_64) CodeDirectory v=20200 size=53750 flags=0x10000(runtime) hashes=1674+3 location=embedded Library validation warning=OS X SDK version before 10.9 does not support Library Validation VersionPlatform=1 VersionMin=658432 VersionSDK=0 Hash type=sha256 size=32 CandidateCDHash sha256=************************************* CandidateCDHashFull sha256=************************************* Hash choices=sha256 CMSDigest=************************************* CMSDigestType=2 Page size=4096 CDHash=************************************* Signature size=8990 Authority=Developer ID Application: <my company name> (<my team ID>) Authority=Developer ID Certification Authority Authority=Apple Root CA Timestamp=May 27, 2020 at 2:35:38 PM Info.plist entries=10 TeamIdentifier=V7L2LD4Q9S Sealed Resources version=2 rules=13 files=1198 Internal requirements count=1 size=184
或者,如果我查看来自应用程序包内 Qt 框架的(随机选择的)可执行文件:
codesign -dv --verbose=4 <appName>.app/Contents/Frameworks/QtCore.framework/Versions/5/QtCore
返回:Executable=<build dir>/<app name>.app/Contents/Frameworks/QtCore.framework/Versions/5/QtCore Identifier=org.qt-project.QtCore Format=bundle with Mach-O thin (x86_64) CodeDirectory v=20500 size=49057 flags=0x10000(runtime) hashes=1526+3 location=embedded VersionPlatform=1 VersionMin=658432 VersionSDK=658944 Hash type=sha256 size=32 CandidateCDHash sha256=************************************* CandidateCDHashFull sha256=************************************* Hash choices=sha256 CMSDigest=************************************* CMSDigestType=2 Page size=4096 CDHash=************************************* Signature size=8990 Authority=Developer ID Application: <my company name> (<my team ID>) Authority=Developer ID Certification Authority Authority=Apple Root CA Timestamp=May 27, 2020 at 2:35:37 PM Info.plist entries=8 TeamIdentifier=V7L2LD4Q9S Runtime Version=10.14.0 Sealed Resources version=2 rules=13 files=1 Internal requirements count=1 size=184
压缩:
ditto -ck --rsrc --sequesterRsrc "<appName>.app" "<appName>.zip"
上传公证:
xcrun altool --notarize-app -t osx -f <appName>.zip --primary-bundle-id="com.<my company name>.<appName>" -u "<develpper ID @ company name> -p "<app specific password>"
收到一封“您的 Mac 软件已成功公证”的电子邮件。
订书钉:
xcrun stapler staple "<appName>.app"
返回:The staple and validate action worked!
分发:
- 创建一个空白的稀疏捆绑磁盘映像。
- 将appName .app 包复制到其中(以及 /Applications 的快捷方式)。
- 转换为只读。
- 分发给用户。
如果我查看 Console.app - 我可以在日志中看到该应用程序被拒绝打开:
default 15:10:56.549137-0400 runningboardd Invalidating assertion 294-139-3156 (target:executable<<appName>(501)>) from originator 139
default 15:11:01.061942-0400 runningboardd [executable<<appName>(501)>:4893] Death sentinel fired!
XprotectService
正如this SO answer所暗示的那样,控制台中没有任何内容。
如果我尝试使用 spctl 检查签名,它会失败:
spctl -v -a -t open --context context:primary-signature <appName>.app
回报:
opal.app: rejected
source=Unnotarized Developer ID
spctl -a -t exec -vv <appName>.app produces
回报:
<appName>.app: rejected
source=Unnotarized Developer ID
origin=Developer ID Application: <my company name> (<team ID>)
produces: invalid API object reference
但是,如果我使用订书机来验证应用程序,它会通过:
stapler validate <appName>.app
返回:
Processing: /<build dir>/<appName>.app
The validate action worked!
关于我的环境:
MacOS 10.15.3
Qt 5.13
Xcode 11.4