gam*_*mma 21 java macos jnlp osx-gatekeeper
我的公司为服务器生成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签名.怎么做?
我想我找到了解决方案.我目前唯一能想到的.我们基本上需要用自定义应用程序启动器包装JNLP,签署应用程序,确保我们可以在服务器上动态修改JNLP然后让它运行.
您可能知道,有一个应用程序捆绑项目可以将任何JAR文件包装到OSX可执行文件中.这可以签名,交付,也不会失败Gatekeeper.我创建了一个自定义分支(主要用于主分叉),它可以获取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.
小智 6
我们已经能够确定您可以使用"开发者ID应用程序"证书签署带有codesign的jnlp文件,如下所示:
codesign -f -s "Developer ID Application: " foo.jnlp
Run Code Online (Sandbox Code Playgroud)
此操作的结果似乎通过本地计算机上的Gatekeeper.但是,似乎签名被存储为扩展HFS属性,因此,如果用户从HTTP事务中获取文件,则不会传输该签名.
如果您使用.jnlp文件并将其打包在某种容器中(例如.dmg或.tar.gz),它可能会有效,但是,这既是很多工作,又提供了相当具有挑战性的用户体验.
| 归档时间: |
|
| 查看次数: |
5755 次 |
| 最近记录: |