使用 jpackage 实用程序的代码签名 + 公证在 macOS 上不起作用

Soh*_*ham 10 java deployment notarize java-14 jpackage

在某些情况下,我使用 jpackage 实用程序尝试创建一个签名的 DMG 文件以交付给我的用户。我需要签署这个DMG的原因是因为我想对软件进行公证。顺便说一句,我不确定是否可以(还)使用 jpackage 进行公证,但无论如何我都在尝试。

但是,我在使用 jpackage 的内置代码签名选项时遇到了麻烦,这是成功公证的先决条件。

我正在使用这些选项运行 jpackage --mac-sign --mac-package-signing-prefix CardrDebate --mac-signing-key-user-name "Developer ID Application: ********** (*******)"(我已经编辑了实际的开发人员 ID,因为它在 StackOverflow 上是公开的)。

创建 jpackage 应用程序映像后,我通过导航到几个生成的 .dylib 文件并尝试测试了生成的代码是否实际签名codesign -vvv {filename}.dylib,并且 codesign 表示该对象根本没有签名(不是它签名不正确,而是它只是根本没有签名)。

因此,我认为我的问题是由于我(可能)在 macOS 上错误地使用了 jpackage 的签名选项。我应该如何使用这些?

Soh*_*ham 17

我将继续回答我自己的问题,因为我最终弄清楚了如何签署我的应用程序并成功通过 Apple 公证服务(我的产品是http://cardr.x10.bz)进行公证。

  1. 使用 jpackage 的 app-image 选项生成未签名的应用程序包。

  2. 使用自动化 bash 脚本对应用程序包内的所有 dylib 和可执行文件进行协同设计,使用codesign -vvv --options runtime --deep --force --sign "Developer ID Application: ********" <filename>.

  3. 这是一个多步骤的过程,所以我将把它分成 A/B/C。

3A) 在 MyApp.app/Contents/mods/ 中找到包含嵌入的 .dylib 文件的所有 jar 文件,并将这些文件解压缩到特定文件夹(或编写一个小程序来为您执行此操作)。对我来说,我的应用程序依赖于 JavaFX,因此许多 JavaFX 库在 jar 文件中包含 .dylib 文件。但是,如果您只是使用默认 Java 库,则应该可以跳到第 4 步,因为默认 Java 库不包含 .dylib 文件。我们需要执行此步骤的原因是因为 Apple 的公证服务也会检查这些嵌入的 .dylib 文件以进行代码签名。

3B) 使用自动 bash 脚本对您刚刚提取的所有 dylib 文件进行编码,使用codesign -vvv --options runtime --deep --force --sign "Developer ID Application: ********" <filename>.

3C) 将每个签名的 .dylib 文件添加回各自的 jar 文件以替换原始未签名的嵌入 .dylib 文件。这是一个可能会派上用场的命令:jar uf <path to jar file> <path to dylib file>. 请注意,指定的第二个路径,即 dylib 文件的路径,也应该是 dylib 在存档中的相对位置。在此处查看更多详细信息 - https://docs.oracle.com/javase/tutorial/deployment/jar/update.html

  1. 现在您已经对 .app 中的每个可执行文件和 dylib 文件进行了签名,是时候对 .app 本身进行签名了。运行codesign -vvv --force --sign "Developer ID Application: ********" MyApp.app

  2. 现在您已经签署了 .app,您需要在应用程序包上运行 jpackage 以从中创建 DMG 或 PKG。随意使用 jpackage mac 签名功能,它将对外部 DMG/PKG 进行签名。请注意,该属性--mac-signing-key-user-name "My Developer Account Name (*******)"不应包含证书的“开发人员 ID 应用程序/安装程序”部分。

  3. 最后,您已经创建了一个准备好进行公证的签名 PKG/DMG。使用xcrun altool --notarize-app --username <apple-id> --password <app-specific-password> <MyApp.dmg or MyApp.pkg>. 等待公证完成并确保获得批准。

  4. 如果公证成功(应该),您可以使用 将您的应用程序票装订到 PKG 安装程序xcrun stapler staple MyApp.pkg

希望这可以帮助!