首页 文章

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

提问于
浏览
21

我的公司为服务器生成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设置 . 这不是一个选择 .

[更新]自OSX 10.9.5起,您还必须使用OSX 10.9进行签名并拥有有效的版本2签名 . 怎么做?

5 回答

  • 2

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

    您可能知道,有一个应用程序捆绑项目可以将任何JAR文件包装到OSX可执行文件中 . 这可以签名,交付,也不会失败Gatekeeper . 我创建了一个自定义fork(它可以用于主叉的拉入),它可以获取JNLP文件,将其包装起来,并且您有一个自定义应用程序,只执行JNLP应该执行的所有操作 .

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

    • 转到bitbucket.org并下载当前版本

    • 运行ant任务并构建appbundler包 .

    • 查看将创建应用程序容器的示例构建脚本的文档 .

    • 该示例现在不将JNLP包含到应用程序中 .

    • 应用程序签名以某种方式创建,以便稍后可以修改JNLP文件 .

    • 将应用程序放入zip文件中 . 这对于下载应用程序很重要,因为它们只是目录

    • 创建服务器代码 . 加载ZIP文件,将JNLP文件放入目录 <yourapp>.app/Contents/Java/

    • 发送zip文件 .

    现在,如果一切顺利,zip文件应该自动解压缩到Download文件夹中,你应该看到你的应用程序图标 . 如果你真的没有弄错,你可以执行应用程序,就像它是正常的一样 .

    我希望这可以帮助很多开发人员用OSX修复破坏的JNLP行为 .

    [可修改的JNLP的更新]自OSX 10.9.5起,它需要在您的应用程序上拥有有效的版本2签名 . 这意味着应用程序捆绑器以前使用的技巧(设置资源列表文件)不再起作用 . 现在必须签署所有内容和任何内容,之后几乎无法更改已签名的应用程序 .

    不过我确实找到了一种方法:使用app bundler . 将JNLP设置为 Contents/_CodeSignature 目录中的文件 . 还没有在那里复制你可修改的JNLP,但这样做,例如稍后在修补zip时使用Java(无论如何你都需要一些代码) .

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

    UPDATE (08-2017)

    甲骨文将在9月底发布Java 9 . appbundler没有正确处理java9 vm . 他们改变了很多API以及javaws的工作方式 . 因为我需要说:如果你想使用包装的JNLP应用程序,请坚持使用java8 .

  • 6

    我们已经能够确定您可以使用“开发者ID应用程序”证书签署带有codesign的jnlp文件,如下所示:

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

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

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

  • 7

    只是总结一下讨论;目前还没有解决方法如何解决这个问题 .

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

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

  • 3

    是否可以将一个名为"myapp"的简单可执行shell脚本捆绑在一个看起来像签名的 .dmg 中这个:

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

    这样你就可以改变 .jnlp 而不用改变你的 .dmg . 我现在不自己尝试一下 .

  • 0

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

    使用xip(发音为“chip”)来创建JNLP文件的签名存档,而不是编码 . 提供您的Developer ID安装程序标识作为--sign选项的参数,而不是您的开发者ID应用程序标识 . xip存档本质上是一个签名的zip存档,因此它可以通过Internet以与zip存档相同的方式提供 . 它将在客户端Mac上自动取消归档 .

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

    从我的实验中, xip 工具总是生成一个存档,当解压缩时,jnlp包含在文件夹中 .

相关问题