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

时间:2013-12-06 17:46:42

标签: java applet java-web-start jnlp signed-applet

由于7u51中的tighter security restrictions,1月到期,我正在尝试签署我的JNLP文件。

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

<property name="my-prop" value="*"/>置于JNLP模板中的天真方法无效。

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

insecure operation security dialog

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

1 个答案:

答案 0 :(得分:6)

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

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

JNLP specification说:

  

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

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

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()将其复制到系统属性。

“不安全操作”对话框

这是使用LiveConnect(Java&lt; - &gt; JavaScript交互)触发的bug in the Oracle plugin

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

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

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

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

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

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

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