繁体   English   中英

如何通过 JNLP 传递其值可能更改为已签名 Java RIA (applet, webstart) 的任意系统属性?

[英]How can I pass arbitrary system properties whose values may change to a signed Java RIA (applet, webstart) via JNLP?

由于7u51更严格的安全限制,将于 1 月到期,我正在尝试签署我的 JNLP 文件。

我们的应用程序需要设置某些自定义系统属性,其中一些属性的值会根据小程序的部署位置而有所不同。 我想避免为每个部署重新签署包含 JNLP 模板的 JAR。

<property name="my-prop" value="*"/>放入 JNLP 模板的幼稚方法不起作用。

即使在模板中使用<property name="my-prop" value="fixed-value"/> ,我有时也会收到一个对话框,提示“此应用程序将执行不安全的操作。您要继续吗?”:

不安全的操作安全对话框

将系统属性传递给已签名的 Java RIA 的正确方法是什么?

在这两个方面,您的应用程序将需要添加一些在启动时执行的简单代码,以解决这两个问题。

属性值中不允许使用通配符

JNLP规范说:

预计JNLP客户端将黑名单(或限制)某些jnlp元素和参数值(例如“java-vm-args”或属性“name”和“value”)以保持安全性。 确切的列表取决于各个JNLP客户端实现。

事实上,Oracle实现(至少在7u45中)确实将<property/>元素的value属性列入黑名单 - 它不能是通配符。 我一直无法找到这个决定背后的任何推理,但事实确实如此。

webstart解决方法允许任意属性名称和值; applet解决方法要求在代码签名时知道属性的名称。

解决方法:Webstart

在JNLP文件中,包含许多通配符参数:

<application-desc main-class="com.example.YourMainClass">
  <argument>*</argument>
  <argument>*</argument>
</application-desc>

在应用程序的main方法中,解析这些参数并使用System.setProperty()将它们复制到系统属性中,跳过仍具有文字值"*" 我建议在第一次出现的"="简单地拆分每个参数。 (如果您的应用程序已经采用了常规参数,则必须更具创造性。)

解决方法:Applet

在JNLP文件中,包含定义需要设置的系统属性的参数:

<applet-desc main-class="com.example.YourMainClassApplet">
  <param name="SYS_PROPERTY_PARAMETERS" value="prop1,prop2"/>
  <param name="prop1" value="*"/>
  <param name="prop2" value="*"/>
</applet-desc>

Applet.init()方法中,获取SYS_PROPERTY_PARAMETERS参数的值,并对其进行迭代以获取每个参数的值。 如果它不是文字"*" ,请使用System.setProperty()将其复制到系统属性。

“不安全操作”对话框

这是Oracle插件中的一个错误 ,它由使用LiveConnect(Java < - > JavaScript交互)触发。

解决方法:“安全”属性前缀

使用"jnlp."在JNLP中通过<property/>元素设置所有系统属性的前缀"jnlp."

<property name="jnlp.my-prop" value="fixed-value"/>

然后在应用程序的main()Applet.init()方法中,迭代System.getProperties()副本 ,如果属性名称以"jnlp."开头"jnlp." ,将其值复制到具有相同名称的属性中,并删除该前缀。 (为避免ConcurrentModificationException必须迭代副本。)

问题:JNLP模板验证器考虑XML属性的顺序

最后,如果填充属性值的过程可能导致JNLP文档中其他元素的属性重新排序,则可能导致JNLP模板验证失败。 (使用DOM解析器解析JNLP,填充通配符,然后使用StreamResult将其流回来是可能发生的一种方式。)例如,我有这两个多属性元素,并且元素的顺序必须匹配:

<jnlp codebase="*" spec="1.0+">
<j2se java-vm-args="-Xms256M -Xmx512M -XX:MaxPermSize=256m" version="1.6+"/>

这是 Oracle Java 中的一个错误。 根据这个错误报告,它应该在版本 9 中得到修复。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM