21

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

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

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

AFAIK Java 有一种机制可以说 JNLP 文件是通过它们各自的 JAR 文件(包含主类的文件)签名的 - 但是:Jar 文件是用不同的证书签名的,它们也不会满足 Gatekeeper 的要求。

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

我不想要的答案:右键单击并打开以覆盖 Gatekeeper 或更改系统或 Java 设置。这不是一个选择。

[更新] 从 OSX 10.9.5 开始,您还必须使用 OSX 10.9+ 进行签名并拥有有效的版本 2 签名。这将如何完成?

4

5 回答 5

7

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

您可能知道,有一个 app bundler 项目可以将任何 JAR 文件打包到 OSX 可执行文件中。这可以签名、交付并且不会使 Gatekeeper 失败。我制作了一个自定义 fork(用于拉入主 fork),它可以获取一个 JNLP 文件,将其包装起来,您就有一个自定义应用程序可以完成 JNLP 应该做的所有事情。

但是,要求是您确实拥有有效的“开发者 ID 申请”证书

  1. 前往bitbucket.org并下载当前版本
  2. 运行 ant 任务并构建 appbundle 包。
  3. 查看将创建应用程序容器的示例构建脚本的文档。
    • 该示例现在不将 JNLP 包含到应用程序中。
    • 应用程序签名以某种方式创建,以便以后可以修改 JNLP 文件。
    • 该应用程序被放入一个 zip 文件中。这对于下载应用程序很重要,因为它们只是目录
  4. 创建您的服务器代码。加载ZIP文件,将JNLP文件放入目录<yourapp>.app/Contents/Java/
  5. 交付 zip 文件。

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

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

[可修改 JNLP 的更新] 自 OSX 10.9.5 起,您的应用程序必须具有有效的版本 2 签名。这意味着应用程序捆绑器(设置资源列表文件)以前使用的技巧不再起作用。现在所有东西都必须签名,之后几乎不可能更改已签名的应用程序。

但是我确实找到了一种方法:使用应用程序捆绑器。将 JNLP 设置为目录内的Contents/_CodeSignature文件。不要在其中复制您的可修改 JNLP,而是在稍后修补 zip 时执行此操作(例如,您将需要一些代码)。

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

更新(08-2017)

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

于 2013-10-29T15:39:15.263 回答
6

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

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

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

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

于 2013-06-09T19:45:32.637 回答
3

从具有 Apple 技术支持的电子邮件线程来看,官方说法似乎是使用该xip工具来解决对 HFS 扩展属性的依赖codesign

使用 xip(发音为“chip”)来创建 JNLP 文件的签名存档,而不是 codesign。提供您的 Developer ID 安装程序身份作为 --sign 选项的参数,而不是您的 Developer ID 应用程序身份。

xip 存档本质上是一个签名的 zip 存档,因此它可以像 zip 存档一样通过 Internet 提供。它将在客户端 Mac 上自动取消归档。

https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/xip.1.html

根据我的实验,该xip工具总是在 unxip'd 时生成一个包含在文件夹中的 jnlp 的存档。

于 2013-06-20T19:45:03.650 回答
2

只是总结讨论;目前没有关于如何解决这个问题的现有解决方案。

这意味着最终用户无法通过 JNLP 轻松启动应用程序。基本上需要告诉用户右键单击并打开以覆盖网关守卫。

另一种解决方案是制作一个签名的 Mac 应用程序并让用户通过磁盘映像安装它。

于 2013-07-17T08:16:54.203 回答
0

将一个名为“myapp”之类的简单可执行shell脚本捆绑在签名.dmg中是否有效,如下所示:

javaws http://path/to/my/app.jnlp

这样你就可以改变.jnlp你喜欢的任何方式而不改变你的.dmg. 我没有 Apple Developer ID,所以我现在不能自己尝试。

于 2016-11-03T15:16:34.427 回答