如何为在 Xcode 之外创建的 MacOS 命令行工具进行公证?

11

现在,MacOS要求所有应用程序都必须经过加固、签名和公证。如果要使用像PyInstaller这样的工具创建XCode之外的应用程序,应如何进行签名和公证?

对于在XTools之外创建的.app 文件的签名和公证问题,我已经解决了。在这个非常有用的帖子中,介绍了如何添加一个 entitlements.plist 来完成对 PyInstaller .app文件的加固。我相信这个方法同样适用于命令行实用工具,但可能还有些缺漏。使用 altool 附带一个包含.app.dmg执行公证测试,可以通过测试并由苹果进行公证。

只需使用相同的过程提交单个命令行实用程序也可以通过公证测试,但不会显示在其他机器的GateKeeper功能中已经签名或者已经经过公证。我认为这与在PyInstaller二进制文件中没有包括有效的Info.plist文件有关,详见 这篇有关于Catalina创建和传递命令行工具的博客文章

使用codesign -dvv检查已签名文件的签名,显示Info.plist 为“未绑定”状态。

$ codesign -dvv ./dist/helloworld
Executable=/Users/aaronciuffo/Documents/src/toy/codesign/dist/helloworld
Identifier=helloworld
Format=Mach-O thin (x86_64)
CodeDirectory v=20500 size=72086 flags=0x10000(runtime) hashes=2244+5 location=embedded
Signature size=9054
Authority=Developer ID Application: Aaron Ciuffo (4H9P6Q65AM)
Authority=Developer ID Certification Authority
Authority=Apple Root CA
Timestamp=Nov 2, 2020 at 9:03:30 PM
Info.plist=not bound
TeamIdentifier=4H9P6Q65AM
Runtime Version=10.11.0
Sealed Resources=none
Internal requirements count=1 size=172

有一个建议的解决方案是使用Go gon包,但据我所知,gon并没有涵盖添加所需的Info.plist

是否有工作流或应用程序可以协助完成此操作?如何在XCode之外创建CL应用程序并成功签名?

2个回答

16

如何手动签署和公证命令行工具

Apple要求所有分发的二进制文件都必须使用付费的Apple开发者帐户进行签名和公证。这可以使用命令行工具完成,例如使用PyInstaller创建的二进制文件或使用gcc编译的文件。

用于此过程的自动化Python脚本

下面链接的脚本允许您使用项目特定的.ini文件来自动执行此过程。

codesign.py

设置

如果您已经有一个配置了XCode中的Developer ID ApplicationDeveloper ID Installer证书的开发人员帐户,请跳过此步骤

  • 创建一个Apple开发者帐户
  • 从Apple App Store下载并安装X-Code
  • 打开并运行X-Code应用程序并安装所需的任何其他内容
  • 打开首选项窗格(cmd+,)并选择帐户
    • 点击左下角的+
    • 选择Apple ID
    • 输入您的Apple ID和密码
    • 之前创建的密钥可以从https://developer.apple.com下载并安装
  • 选择要使用的开发者帐户
  • 选择管理证书...
  • 点击左下角的+,然后选择Developer ID Application
  • 点击左下角的+,然后选择Developer ID Installer

为altool创建应用程序特定密码

来自Apple的说明

  • 打开KeyChain Access
  • 创建“新密码项目”
    • 钥匙链项名称:Developer-altool
    • 帐户名称:您的开发者帐户电子邮件
    • 密码:您刚创建的应用程序特定密码

使用Pyinstaller或其他工具创建可执行二进制文件

NB!可能需要添加额外的参数,例如--add-data来构建功能性二进制文件

  • 创建单个文件二进制文件
    • pyinstaller --onefile myapp.py

签署可执行文件

  • 将entitements.plist添加到目录中(见下文)
  • 列出可用的密钥并找到Developer ID Application证书:
    • security find-identity -p basic -v
    1) ABC123 "Apple Development: aaronciuffonl@gmail.com ()"
    2) XYZ234 "Developer ID Installer: Aaron Ciuffo ()"
    3) QRS333 "Developer ID Application: Aaron Ciuffo ()"
    4) LMN343 "Developer ID Application: Aaron Ciuffo ()"
    5) ZPQ234 "Apple Development: aaron.ciuffo@gmail.com ()"
    6) ASD234 "Developer ID Application: Aaron Ciuffo ()"
    7) 01010A "Developer ID Application: Aaron Ciuffo ()"
       7 valid identities found
    
  • codesign --deep --force --options=runtime --entitlements ./entitlements.plist --sign "HASH_OF_DEVELOPER_ID APPLICATION" --timestamp ./dist/foo.app

将应用程序打包为 pkg 文件以进行安装

  • 创建一个临时目录以构建 pkg 文件结构:
    • mkdir /tmp/myapp
  • 使用 ditto 命令构建 pkg 安装程序的结构:
    • ditto /path/to/myapp /tmp/myapp/path/to/install/location
      • 在目标设备上将应用程序“WhizBang”安装到 /Applications/ 中,请使用以下命令:ditto ~/src/whiz_bang/dist/whizBang /tmp/whiz_bang/Applications/
    • 对于所有需要打包的文件,重复以上步骤。
  • 构建 pkg 文件:
  • productbuild --identifier "com.your.pkgname.pkg" --sign "HASH_OF_INSTALLER_ID" --timestamp --root /tmp/myapp / myapp.pkg
  • NB! --root 选项的格式如下:--root <ditto 路径> <目标系统上从中安装的相对路径> <签名的 .pkg 文件>

验证应用程序是否已经通过 Notarize 审核

  • xcrun altool --notarize-app --primary-bundle-id "com.foobar.fooapp" --username="developer@foo.com" --password "@keychain:Developer-altool" --file ./myapp.pkg
  • 检查您的电子邮件以确认审核是否成功。
    • 或者,使用以下命令检查状态:
      • xcrun altool --notarization-history 0 -u "developer@***" -p "@keychain:Developer-altool"
  • 如果审核失败,请使用以下命令查看详细日志:
  xcrun altool --notarization-info "Your-Request-UUID" \
             --username "username@example.com" \                                    
             --password "@keychain:Developer-altool"   

将公证添加到pkg包中

  • 将公证添加到pkg包中
    • xcrun stapler staple ghostscript64.pkg

有用的资源


1
非常全面,谢谢!也适用于公证 DMG 文件。 - yodavid
2
如果你的工具链中有任何一部分不在XCode之内,苹果确实不会让事情变得容易! - Aaron Ciuffo
2
真的吗?我必须支付费用才能将我的应用程序部署到Mac上吗?那我猜就没有Mac支持了... - Robert S.
是的,这真是遗憾。我猜苹果不喜欢开源。我想为所有人提供跨平台开源软件,但现在却这样了。 :/ - Robert S.
@RobertS。你知道签署Windows应用程序也需要付费证书吗?很多恶意软件都有我们可能认为是开源内容的东西,所以,是的,苹果和微软都不喜欢一些开源。 - Manngo
显示剩余6条评论

2

DMG分发

如果您想在DMG中分发您的二进制文件,除了在二进制文件上调用codesign之外,还必须正确创建DMG。

首先创建您的文件夹并清除任何垃圾,否则上传将失败。使用Aaron Ciuffo的帖子交换PKG命令。

mkdir DistributionFolder
xattr -cr ./DistributionFolder

然后将二进制文件移动到该文件夹中,并创建一个大小适当的DMG。
hdiutil create -fs HFS+ -volname MyApp -srcfolder ./DistributionFolder ./Distribution.dmg

弹出驱动器。签署DMG并上传。一旦公证,您可以像Aaron的答案中那样装订。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接