如何为OSX和Gatekeeper签署(动态)JNLP文件



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

问题是:如何做到这一点?我敢说你可以签署应用程序(我们有一些Java应用程序与开发者id签署)-但JNLP -文件只是:文件。

下一步:如何对生成的JNLP文件执行此操作。我们必须在它们来自服务器时对它们进行修改——例如属性、基础URL等等。

AFAIK Java有一种特定的机制来说明JNLP文件是通过它们各自的JAR文件(保存主类的JAR文件)签名的——但是:JAR文件是用不同的证书签名的,它们也不会满足Gatekeeper。

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

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

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

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

你可能知道,有一个应用捆绑器项目可以将任何JAR文件打包成OSX可执行文件。这可以签名,交付,不会失败的看门人。我做了一个自定义的分支(它可以被拉进主分支),它可以接受一个JNLP文件,把它包装起来,你就有了一个自定义的应用程序,它可以做JNLP应该做的所有事情。

然而,一个要求是,您确实有一个有效的"开发者ID应用程序"证书

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

现在,如果一切正常,zip文件应该自动在下载文件夹中解压缩,您应该看到您的应用程序图标。如果你真的没有出错,你可以执行应用程序,就像它是一个正常的应用程序。

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

[UPDATE for modifiable jnlp]由于OSX 10.9.5,它需要在你的应用程序上有有效的版本2签名。这意味着它以前被应用程序捆绑器使用的技巧(设置资源列表文件)不再工作了。现在所有的东西都必须签名,并且几乎不可能在之后更改签名的应用程序。

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

请注意:这应该真的只需要,如果你必须把另一个JNLP文件动态地放入应用程序容器(这就是问题是关于)

更新(08 - 2017)

Oracle将在九月底发布Java 9。appbundler不能正确处理java9 vm。他们改变了很多API和java的工作方式。因为我需要说:如果您想使用包装的JNLP应用程序,请坚持使用java8。

我们已经能够确定您可以使用codesign签署jnlp文件,使用"Developer ID Application"证书,如下所示:

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

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

如果将.jnlp文件打包到某种容器中(如.dmg或.tar.gz),则可能行得通,但是,这不仅需要大量的工作,而且还提供了相当具有挑战性的用户体验。

从Apple技术支持的电子邮件中,似乎官方的话是使用xip工具来解决对codesign的HFS扩展属性的依赖:

使用xip(发音为"chip")代替codesign创建JNLP文件的签名归档。提供你的开发者ID安装程序标识,作为——sign选项的参数,而不是Developer ID应用程序标识。

一个xip归档本质上是一个签名的zip归档,所以它可以被提供以与zip存档相同的方式在Internet上传输。它将是在客户端Mac上自动取消归档。

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

根据我的实验,xip工具总是在解绑定时生成包含在文件夹中的jnlp的归档文件。

总结一下讨论;目前还没有解决这个问题的方法。

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

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

将一个简单的可执行shell脚本捆绑在一个有符号的.dmg中,它看起来像这样吗?

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

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

相关内容

  • 没有找到相关文章

最新更新