我的公司为服务器生成Java应用程序并提供JNLP文件以启动本地应用程序。从OSX 10.8.4开始,需要使用开发者ID对JNLP文件进行签名,以保持Gatekeeper满意(实际上它位于最底部的release notes)。
问题是:如何做到这一点? AFAIK你可以签署应用程序(我们有一些使用开发者ID签名的Java应用程序) - 但JNLP - 文件只是:文件。
下一步:如何使用生成的JNLP文件执行此操作。我们必须修改它们来自服务器 - 例如属性,基本URL等。
AFAIK Java has a certain mechanism说JNLP文件是通过各自的JAR文件(持有主类的文件)签署的 - 但是:Jar文件使用不同的证书签名,他们也不会满足Gatekeeper。
我找到了one reference on how to sign tools and stuff,但它不适用于动态文件的情况。
我不想要的答案:右键单击并打开以覆盖关守或更改系统或Java设置。这不是一个选择。
[UPDATE] 从OSX 10.9.5开始,您还必须使用OSX 10.9+进行签名并拥有有效的版本2签名。这将如何完成?
答案 0 :(得分:7)
我想我找到了解决方案。我目前唯一能想到的。我们基本上需要使用自定义应用程序启动程序包装JNLP,对应用程序进行签名,确保我们可以在服务器上动态修改JNLP然后让它运行。
您可能知道,有一个应用程序捆绑项目可以将任何JAR文件包装到OSX可执行文件中。这可以签名,交付,也不会失败Gatekeeper。我创建了一个自定义的fork(它可以用于主叉的拉取),它可以获取JNLP文件,将其包装起来,并且您有一个自定义应用程序,只执行JNLP应该执行的所有操作。
但要求是,您确实拥有有效的“开发者ID申请”证书
<yourapp>.app/Contents/Java/
现在,如果一切顺利,zip文件应自动解压缩到Download文件夹中,您应该会看到您的应用程序图标。如果你真的没有弄错,你可以像正常一样执行应用程序。
我希望这会帮助很多开发人员用OSX修复破坏的JNLP行为。
[可修改JNLP的更新] 自OSX 10.9.5起,您的应用程序需要具有有效的版本2签名。这意味着应用程序捆绑器以前使用的技巧(设置资源列表文件)不再起作用。现在必须签署所有内容和任何内容,之后几乎无法更改已签名的应用程序。
但我确实找到了一种方法:使用app bundler。将JNLP设置为Contents/_CodeSignature
目录中的文件。还没有在那里复制你的可修改的JNLP,但这样做,例如在修补zip时稍后使用Java(无论如何你都需要一些代码)。
请注意:如果您必须将另一个JNLP文件动态地放入应用程序容器中(这就是问题所在),这应该只需要这样做。
更新(08-2017)
Oracle将在9月底发布Java 9。 appbundler没有正确处理java9 vm。他们改变了很多API和javaws的工作方式。因为我需要说:如果你想使用包裹的JNLP应用程序,坚持使用java8。
答案 1 :(得分:6)
我们已经确定您可以使用“开发者ID应用程序”证书签署带有codesign的jnlp文件,如下所示:
codesign -f -s "Developer ID Application: " foo.jnlp
此操作的结果似乎在本地计算机上传递了Gatekeeper。但是,似乎签名被存储为扩展HFS属性,因此,如果用户从HTTP事务中获取文件,则不会传输它。
如果您使用.jnlp文件,并将其打包在某种容器中,如.dmg或.tar.gz,它可能会有效,但是,这既是很多工作,又提供了相当具有挑战性的用户体验。
答案 2 :(得分:3)
在Apple技术支持的电子邮件主题中,似乎官方的一句话就是使用xip
工具来解决依赖codesign
的HFS扩展属性的问题:
使用xip(发音为“chip”)而不是协同设计 创建JNLP文件的签名存档。提供您的开发者 ID安装程序标识作为--sign选项的参数,而不是您的 开发者ID应用程序标识。
xip存档本质上是一个签名的zip存档,因此可以提供服务 通过互联网以与zip存档相同的方式。这将是 在客户端Mac上自动取消归档。
https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/xip.1.html
从我的实验中,xip
工具总是生成一个存档,当解压缩时,jnlp包含在文件夹中。
答案 3 :(得分:2)
总结一下讨论;目前还没有关于如何解决这个问题的现有解决方案。
这意味着最终用户无法轻松通过JNLP启动应用程序。基本上,需要告诉用户右键单击并打开以覆盖关守。
另一个解决方案是制作一个已签名的Mac应用程序,让用户通过磁盘映像安装它。
答案 4 :(得分:0)
是否可以捆绑一个名为&#34; myapp&#34;的简单可执行shell脚本。在签名.dmg
中,如下所示:
javaws http://path/to/my/app.jnlp
这样您可以随意更改.jnlp
,而无需更改.dmg
。我没有Apple开发者ID,所以我现在无法自己尝试。