【问题标题】:How Do I Go About Code Signing a MacOS Application?如何对 MacOS 应用程序进行代码签名?
【发布时间】:2021-11-20 00:58:35
【问题描述】:

我所在大学的一位教授开发了一个 MacOS 应用程序,他需要对其进行签名,这样当用户尝试运行它时它就不会被 MacOS 阻止。我已经获得了他的 CSR 并获得了为他创建的 Apple Developer 证书(使用“ad hoc”分发选项,该选项创建了一个名为“distribution.cer”的证书文件)。

我在 Apple 开发者网站上搜索了有关如何使用 XCode 对应用程序进行签名的信息,但我不能完全掌握说明,因为我不是 XCode 用户或 Apple 开发者。

据我所知,您还可以从终端签署应用程序,对吗?如果是这样,它是否仅适用于 .pkg 安装程序,或者也适用于预编译的应用程序(.app 文件)?

【问题讨论】:

    标签: xcode macos code-signing code-signing-certificate


    【解决方案1】:

    代码签名

    Apple 证书

    1. 开发者 ID 应用程序证书 - 签署 macOS 应用程序以在 Mac App Store 之外分发。
    2. 开发者 ID 安装程序证书 - 签署应用程序的安装程序包(如果有),以便在 Mac App Store 之外分发。

    签署应用程序

    在终端的命令行上:

    codesign -f -o runtime --timestamp -s "Developer ID Application: YOUR NAME (TEAM_ID)" /path/to/bundle.app
    

    公证

    请注意,自 macOS 10.14.5 (Mojave) 起,使用新 Apple 开发者证书签名的软件必须经过公证。代码签名不再足以绕过 Gatekeeper。

    Apple 的公证服务要求您:

    • 为您分发的所有可执行文件启用代码签名。
    • 为您的应用程序和命令行目标启用强化运行时功能(在运行协同设计工具时包括 -o 运行时选项)。
    • 为您的代码签名签名使用“开发者 ID”应用程序、内核扩展或安装程序证书。
    • 在您的代码签名签名中包含一个安全时间戳(在运行代码签名工具时包括 --timestamp 选项)。
    • 请勿将 com.apple.security.get-task-allow 权利设置为 true 的任何变体。
    • 链接到 macOS 10.9 或更高版本的 SDK。

    第 1 步 - 创建磁盘映像

    通过打开终端并运行以下命令来创建应用程序的磁盘映像:

    hdiutil create -volname MyApp -srcfolder /path/to/MyApp.app -ov -format UDBZ MyApp.dmg
    

    第 2 步 - 对磁盘映像进行代码签名

    通过打开终端并运行以下命令对磁盘映像进行代码签名:

    codesign -s "Developer ID Application: YOUR NAME (TEAM ID)" --timestamp MyApp.dmg
    

    第 3 步 - 生成应用专用密码

    生成应用专用密码,请参阅this Apple Support article。注意:这是一个特定于公证应用程序 (xcrun altool) 而不是被公证应用程序的密码。因此,您只需执行一次,但请确保复制生成的密码并将其保存在某处。

    第 4 步 - 将磁盘映像上传到公证服务

    注意:当你对容器磁盘镜像进行公证时,altool也会对里面的应用程序进行公证,所以你可以跳过对应用程序本身进行公证的步骤。

    通过打开终端并运行以下命令将磁盘映像文件上传到 Apple 公证服务:

    xcrun altool --notarize-app --primary-bundle-id "<your identifier>" -u "<your email>" -p "<app-specific pwd>" -t osx -f /path/to/MyApp.dmg
    

    primary-bundle-id 可帮助您跟踪来自公证服务的自动通信。您提供的值不需要与提交的应用程序的捆绑标识符匹配或具有任何特定值。它只需要对你有意义。每当向您发送有关给定 altool 提交的电子邮件时,公证服务都会包含该值。

    如果上传成功,您应该会收到类似于以下内容的输出:

    No errors uploading 'MyApp.dmg'.
    RequestUUID = 3af4e56f-162b-75bc-827f-7233f92bf20c
    

    第 5 步 - 检查公证过程

    公证过程通常需要不到 15 分钟,因此您可能需要不时通过打开终端并运行以下命令来检查其进度:

    xcrun altool --notarization-history 0 -u "<your email>" -p "<app-specific pwd>"
    

    当公证过程成功完成后,上述命令将返回类似以下的信息:

    Notarization History - page 0
    
    Date                      RequestUUID                          Status    Status Code Status Message   
    ------------------------- ------------------------------------ ------- ----------- ---------------- 
    2019-12-08 06:24:03 +0000 3af4e56f-162b-75bc-827f-7233f92bf20c success 0           Package Approved 
    

    您还应该收到来自 Apple 的类似于以下内容的电子邮件,以便成功进行公证:

    Dear <First_Name>,
    Your Mac software has been notarized. You can now export this software and distribute it directly to users.
    Bundle Identifier: com.example.MyApp.001
    Request Identifier: 3af4e56f-162b-75bc-827f-7233f92bf20c
    For details on exporting a notarized app, visit Xcode Help or the notarization guide.
    Best Regards,
    Apple Developer Relations
    

    第 6 步 - 将票据装订到磁盘映像

    公证过程会生成一张票证,告诉 Gatekeeper 您的应用程序已经过公证。公证成功完成后,下次任何用户尝试在 macOS 10.14 或更高版本上运行您的应用程序时,Gatekeeper 将在线查找票证。这包括在公证之前下载您的应用程序的用户。

    在步骤 5 收到“Package Approved”状态消息后,您还应该使用订书机工具将票据附加到磁盘映像文件中,以便将来的发行版包含票据。这确保即使网络连接不可用,Gatekeeper 也能找到票证。

    要将票证装订到磁盘映像文件,请打开终端并运行以下命令:

    xcrun stapler staple /path/to/MyApp.dmg
    

    如果命令成功完成,输出应该类似于:

    Processing: /Path/to/MyApp.dmg
    Processing: /Path/to/MyApp.dmg
    The staple and validate action worked!
    

    第 7 步 - 验证磁盘映像的公证

    要验证磁盘映像的公证,请打开终端并运行以下命令:

    spctl -a -vv -t install MyApp.dmg
    

    公证过程的成功验证应产生类似于以下内容的输出:

    MyApp.dmg: accepted
    source=Notarized Developer ID
    origin=Developer ID Application: <Developer Name> (<TEAM_ID>)
    

    第 8 步 - 验证申请的公证

    要验证应用程序的公证,安装应用程序,打开终端并运行以下命令:

    spctl -a -vv /Applications/MyApp.app
    

    公证过程的成功验证应产生类似于以下内容的输出:

    /Applications/MyApp.app: accepted
    source=Notarized Developer ID
    origin=Developer ID Application: <Developer Name> (<TEAM_ID>)
    

    重要提示:将应用程序放在 Applications 目录中进行测试。在“已安装”位置时,Gatekeeper 对它的处理方式有所不同。

    另外,Apple 推荐的验证应用程序公证的方法是打开终端并运行以下命令:

    xcrun stapler validate MyApp.app
    

    公证过程的成功验证应产生类似于以下内容的输出:

    Processing: MyApp.app
    The validate action worked!
    

    【讨论】:

      猜你喜欢
      • 2018-06-26
      • 2020-08-03
      • 1970-01-01
      • 2020-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-25
      相关资源
      最近更新 更多