如何为osx和gatekeeper签署(动态)jnlp文件

7rtdyuoh  于 2021-06-30  发布在  Java
关注(0)|答案(5)|浏览(357)

我的公司为服务器生产java应用程序,并提供jnlp文件来启动本地应用程序。由于osx10.8.4,需要用开发人员id对jnlp文件进行签名,以保持gatekeeper满意(实际上在最下面的发行说明中)。
问题是:如何做到这一点?afaik你可以签署应用程序(我们有一些用开发者ID签署的java应用程序),但是jnlp文件就是:文件。
下一步:如何对生成的jnlp文件执行此操作。我们必须修改它们,因为它们来自服务器-例如属性、基本url等等。
afaikjava有一种特定的机制,可以说jnlp文件是通过它们各自的jar文件(持有主类的jar文件)签名的,但是:jar文件是用不同的证书签名的,它们也不能满足gatekeeper的要求。
我确实找到了一个关于如何签署工具和东西的参考,但它不适用于动态文件的场景。
我不想要的答案是:右键单击并打开以覆盖网守或更改系统或java设置。这不是一个选择。
[更新]由于osx 10.9.5,您还必须使用osx 10.9+进行签名,并具有有效的版本2签名。如何做到这一点?

kupeojn6

kupeojn61#

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

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

此操作的结果似乎传递给了本地计算机上的gatekeeper。但是,签名似乎存储为扩展的hfs属性,因此,如果用户从http事务获取文件,则不会传输该签名。
如果您将.jnlp文件打包到某种容器中,比如.dmg或.tar.gz,那么它可能会起作用,但是,这需要大量的工作,而且它提供了相当具有挑战性的用户体验。

pbpqsu0x

pbpqsu0x2#

只是总结一下讨论;目前还没有解决这个问题的方案。
这意味着最终用户无法通过jnlp轻松启动应用程序。基本上,需要告诉用户右键单击并打开以覆盖网守。
另一种解决方案是制作一个签名的mac应用程序,并让用户通过磁盘映像安装该应用程序。

yc0p9oo0

yc0p9oo03#

我想我找到了解决办法。我现在唯一能想到的。我们基本上需要用一个定制的应用程序启动程序 Package jnlp,签署应用程序,确保我们可以在服务器上动态修改jnlp,然后让它运行。
如您所知,有一个appbundler项目可以将任何jar文件打包到osx可执行文件中。这是可以签署,交付,将不会失败的守门员。我做了一个定制的fork(这是一个对主fork的pull int),它可以接受一个jnlp文件,打包它,然后您就有一个定制的应用程序来做jnlp应该做的所有事情。
但是,一个要求是您必须拥有有效的“开发人员id应用程序”证书
点击bitbucket.org下载最新版本
运行ant任务并构建appbundler包。
请查看文档中创建应用程序容器的示例构建脚本。
该示例现在没有将jnlp包含到应用程序中。
应用程序签名是以这样的方式创建的,以便以后可以修改jnlp文件。
应用程序正在放入zip文件中。这对于下载应用程序很重要,因为它们只是目录
创建服务器代码。加载zip文件,将jnlp文件放入目录 <yourapp>.app/Contents/Java/ 传递zip文件。
现在,如果一切顺利,zip文件应该自动解压缩到下载文件夹中,您应该看到您的应用程序图标。如果您真的没有犯错误,您可以像执行普通应用程序一样执行该应用程序。
我希望这将有助于许多开发人员用osx修复损坏的jnlp行为。
[更新可修改jnlps]由于osx 10.9.5,您的应用程序上必须有有效的版本2签名。这意味着以前由app bundler使用的技巧(设置资源列表文件)不再有效。一切和任何东西都必须签署现在和它几乎是不可能改变签署后的应用程序。
不过,我还是找到了一种方法:使用appbundler。将jnlp设置为 Contents/_CodeSignature 目录。不要在那里复制可修改的jnlp,但要这样做,例如稍后在修补zip时使用java(无论如何,这里需要一些代码)。
请注意:只有当您必须将另一个jnlp文件动态地放入app容器中时,才真正需要这个文件(这就是问题所在)
更新(08-2017)
甲骨文将在9月底发布Java9。appbundler无法正确处理java9 vm。他们改变了很多api和javaws的工作方式。因为我要说的是:如果你想使用 Package 好的jnlp应用程序,就要坚持使用java8。

dpiehjr4

dpiehjr44#

从苹果技术支持的一封邮件来看,官方的说法似乎是使用 xip 工具来解决对hfs扩展属性的依赖 codesign :
使用xip(发音为“chip”)来创建jnlp文件的签名存档,而不是codesign。提供开发人员id安装程序标识作为--sign选项的参数,而不是开发人员id应用程序标识。
xip存档本质上是一个签名的zip存档,因此它可以通过与zip存档相同的方式在internet上提供服务。它将在客户端mac上自动取消归档。
https://developer.apple.com/library/mac/documentation/darwin/reference/manpages/man1/xip.1.html
从我的实验中 xip 解压时,该工具总是使用文件夹中包含的jnlp生成一个存档。

tmb3ates

tmb3ates5#

将一个名为“myapp”的简单可执行shell脚本捆绑到签名的 .dmg 看起来是这样的:

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

这样你就可以改变 .jnlp 你想怎么做就怎么做 .dmg . 我没有苹果开发者id,所以我现在不能自己尝试。

相关问题