【问题标题】:How to notarize an MacOS command line tool created outside of XCode?如何公证在 XCode 之外创建的 MacOS 命令行工具?
【发布时间】:2021-02-15 12:46:38
【问题描述】:

MacOS 现在要求所有应用程序都经过强化、签名和公证。如何使用 PyInstaller 之类的工具对在 XCode 之外创建的应用程序进行签名和公证?

我已经整理好了在 XTools 之外创建的 .app 文件的签名和公证。有一个非常有用的线程 here 展示了如何添加一个 entitlements.plist 来完成 PyInstaller .app 文件的强化。我相信这也适用于命令行实用程序,但可能会丢失一些东西。使用altool 提交包含.app.dmg 进行公证将通过测试并由Apple 公证。

使用相同过程提交单个命令行实用程序也将通过公证,但不会在其他机器上显示为 GateKeeper 功能签名或公证。我认为这与 this blog post about building and delivering command line tools for Catalina 中详述的 PyInstaller 二进制文件中不包含有效的 Info.plist 文件有关。

使用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

一个suggested solution is using the Go gon package,但据我所知,gon 不包括添加所需的Info.plist

是否有可以帮助解决此问题的工作流程或应用程序?如何在 XCode 之外创建 CL 应用程序并成功对其进行签名?

【问题讨论】:

    标签: xcode macos pyinstaller


    【解决方案1】:

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

    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下载和安装
    • 选择您要使用的开发者帐户
    • 选择管理证书...
    • 点击左下角的+,选择开发者ID申请
    • 点击左下角的+,选择Developer ID Installer

    为 altool 创建应用专用密码

    Instructions from Apple

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

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

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

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

    签署可执行文件

    • 将entitements.plist 添加到目录中(见下文)
    • 列出可用密钥并找到 Developer ID 应用程序证书:
      • 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 进行安装

    • 创建一个临时目录来构建包:
      • mkdir /tmp/myapp
    • 使用同上构建 pkg 安装程序结构
      • ditto /path/to/myapp /tmp/myapp/path/to/install/location
        • 将应用程序“WhizBang”安装到目标使用的/Applications/ 中:ditto ~/src/whiz_bang/dist/whizBang /tmp/whiz_bang/Applications/
      • 重复所有应该打包的文件
    • 构建包
    • productbuild --identifier "com.your.pkgname.pkg" --sign "HASH_OF_INSTALLER_ID" --timestamp --root /tmp/myapp / myapp.pkg
    • 注意!--root 选项的格式如下:--root <ditto path> <relative path on target system to install from> <signed .pkg file>

    公证

    • 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

    有用的资源

    【讨论】:

    • 真的很全面,谢谢!也适用于公证 DMG 文件。
    • 如果你的工具链的任何部分落在 XCode 之外,Apple 肯定不会让事情变得容易!
    • 认真的吗?我必须付费才能将我的应用程序部署到 Mac?我想那时没有 Mac 支持...
    • @RobertS。对。如果您想提供更新,您每年都需要付费。我认为这是为了使通过此渠道发布恶意软件在财务上变得不切实际。仍然让我感到困扰的是,我必须付费才能分发免费软件。我不认为 Apple 对我们的代币感兴趣,因为他们对控制其设备发布的各个方面都很感兴趣。
    • 是的,很遗憾。我猜苹果不喜欢开源。我想为所有人提供跨平台的开源软件,然后是这个。 ://
    【解决方案2】:

    DMG 分布

    使用 Aaron Ciuffo 的帖子交换 PKG 命令与此

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

    首先创建您的文件夹,然后清除任何垃圾或上传将失败。

    mkdir DistributionFolder
    xattr -cr ./DistributionFolder
    

    然后将二进制文件移动到该文件夹​​并创建一个适当大小的 DMG

    hdiutil create -fs HFS+ -volname MyApp -srcfolder ./DistributionFolder ./Distribution.dmg
    

    弹出驱动器。签署 DMG 并上传。公证后,您可以装订与 Aaron 的答案相同的订书钉。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-23
      • 2017-05-10
      • 1970-01-01
      • 2014-06-26
      • 2017-07-21
      • 2012-03-08
      • 2012-03-08
      • 2021-03-07
      相关资源
      最近更新 更多