gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:47:25 25 4
gpt4 key购买 nike

由于tighter security restrictions7u51 ,一月份到期,我正在尝试签署我的 JNLP 文件。

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

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

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

insecure operation security dialog

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

最佳答案

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

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

JNLP specification说:

It is expected that a JNLP Client will blacklist (or restrict) certain jnlp elements and argument values such as "java-vm-args" or property "name" and "value" to maintain security. The exact list is up to the individual JNLP Client implementations.

事实上,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() 将其复制到系统属性.

“不安全操作”对话框

这是一个 bug in the Oracle plugin这是通过使用 LiveConnect(Java <-> JavaScript 交互)触发的。

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

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

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

然后在你应用程序的main()Applet.init()方法,遍历 的副本 System.getProperties() 并且,如果属性名称以 "jnlp." 开头,将其值复制到同名的属性中,并去掉该前缀。 (迭代副本是避免 ConcurrentModificationException 的必要条件。)

陷阱:JNLP 模板 validator 考虑 XML 属性的顺序

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

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

关于java - 如何通过 JNLP 将值可能更改为已签名的 Java RIA(applet、webstart)的任意系统属性传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20430289/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com