首页 文章

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

提问于
浏览
3

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

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

<property name="my-prop" value="*"/> 放在JNLP模板中的天真方法不起作用 .

即使模板中有 <property name="my-prop" value="fixed-value"/> ,我有时会得到一个对话框"This application is going to perform an insecure operation. Do you want to continue?":

insecure operation security dialog

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

1 回答

  • 6

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

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

    JNLP specification说:

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

    “不安全操作”对话框

    这是使用LiveConnect(Java < - > JavaScript交互)触发的bug in the Oracle plugin .

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

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

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

    然后在您的应用程序的 main()Applet.init() 方法中,迭代System.getProperties()的副本,如果属性名称以 "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+"/>
    

相关问题