如何为 OSX 和网守的(动态)JNLP 文件签名

2022-09-02 04:31:24

我的公司生产用于服务器的Java应用程序,并提供JNLP文件来启动本地应用程序。从OSX 10.8.4开始,需要使用开发人员ID对JNLP文件进行签名,以使Gatekeeper满意(它实际上在最底部的发行说明中)。

问题是:如何做到这一点?AFAIK,你可以对应用程序进行签名(我们有一些使用开发人员ID签名的Java应用程序) - 但JNLP - 文件就是这样:文件。

下一篇: 如何使用生成的JNLP文件执行此操作。当它们来自服务器时,我们必须修改它们 - 例如属性,基本URL等。

AFAIK Java有一定的机制,说JNLP文件通过它们各自的JAR文件(保存主类的文件)进行签名 - 但是:Jar文件使用不同的证书签名,它们也不会满足Gatekeeper的要求。

我确实找到了一个关于如何对工具和东西进行签名的参考,但它不适用于动态文件的场景。

我不想要作为答案:右键单击并打开以覆盖网守或更改系统或Java设置。这不是一个选项。

[更新]从OSX 10.9.5开始,您还必须使用OSX 10.9 +进行签名,并具有有效的版本2签名。如何做到这一点?


答案 1

我想我找到了一个解决方案。我目前唯一能想到的。我们基本上需要用一个自定义的应用程序启动器包装JNLP,对应用程序进行签名,确保我们可以在服务器上动态修改JNLP,然后让它运行。

如您所知,有一个应用程序捆绑程序项目可以将任何JAR文件打包到OSX可执行文件中。这可以签名,交付,并且不会失败的网守。我做了一个自定义分叉(这是在主分叉上拉入的),它可以获取一个JNLP文件,把它包装起来,你有一个自定义应用程序做JNLP应该做的所有事情。

但是,要求是您拥有有效的“开发人员 ID 应用程序”证书

  1. 前往 bitbucket.org 并下载当前版本
  2. 运行 ant 任务并生成应用程序捆绑程序包。
  3. 查看将创建应用容器的示例生成脚本的文档。
    • 该示例目前尚未将 JNLP 包含在应用程序中。
    • 应用程序签名的创建方式是这样的,以便以后可以修改 JNLP 文件。
    • 应用程序正在放入 zip 文件中。这对于下载应用程序非常重要,因为它们只是目录
  4. 创建服务器代码。加载 ZIP 文件,将 JNLP 文件放入目录中<yourapp>.app/Contents/Java/
  5. 传递 zip 文件。

现在,如果一切顺利,zip文件应该自动解压缩在下载文件夹中,您应该看到您的应用程序图标。如果您真的没有犯错,则可以像执行普通应用程序一样执行该应用程序。

我希望这将有助于许多开发人员使用OSX修复损坏的JNLP行为。

[可修改的JNLP的更新]由于OSX 10.9.5,因此需要在应用程序上具有有效的版本2签名。这意味着它以前由应用程序捆绑程序使用的技巧(设置资源列表文件)不再有效。现在必须对所有内容和任何内容进行签名,之后几乎不可能更改已签名的应用程序。

但是,我确实找到了一种方法:使用应用程序捆绑器。将 JNLP 设置为目录中的一个文件。不要在那里复制可修改的JNLP,但这样做,例如,稍后在修补zip时使用Java(无论如何,您都需要在这里使用一些代码)。Contents/_CodeSignature

请注意:只有当您必须将另一个JNLP文件动态放入应用程序容器中时,才需要这样做(这就是问题所在)

更新 (08-2017)

Oracle将于9月底发布Java 9。应用程序分发程序无法正确处理 java9 vm。他们改变了很多API和javaws的工作方式。对于我需要说:如果你想使用打包的JNLP应用程序,请坚持使用java8。


答案 2

我们已经能够确定您可以使用“开发人员 ID 应用程序”证书对带有 codeign 的 jnlp 文件进行签名,如下所示:

codesign -f -s "Developer ID Application: " foo.jnlp

此操作的结果似乎在本地计算机上传递了网守。但是,签名似乎被存储为扩展的HFS属性,因此,如果用户从HTTP事务中获取文件,则不会传输它。

如果您获取.jnlp文件并将其打包在某种容器中(例如.dmg或.tar.gz),则可能会起作用,但是,这既是很多工作,又提供了相当具有挑战性的用户体验。