启动按模板签名的JNLP时,继续获取“JNLPSigningException [无法验证启动文件的签名]”

时间:2013-10-22 21:24:33

标签: java oracle jnlp

我们决定按照this oracle指南签署我们的JNLP文件。由于我们有不同的JNLP,我们采用了第二种方法(使用JNLP模板签署JAR文件)。

这是我们提取到模板中的代码:

<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+" codebase="*" href="*">
  <information>
    <title>*</title>
    <vendor>My vendor</vendor>
    <description>My description</description>
    <icon href="splash.jpg" kind="splash" width="700" height="400" size="115258"/>
    <offline-allowed />
    <shortcut>
      <menu submenu="My submenu"/>
    </shortcut>
  </information>

  <security>
    <all-permissions/>
  </security>

  <resources locale="en es ja">
    <j2se version="1.6+" initial-heap-size="128m" max-heap-size="384m" href="http://java.sun.com/products/autodl/j2se"/>
    <jar href="myjar.jar" main="true" download="lazy" part="core" size="*"/>
    <jar href="lib/commons-lang-2.6.jar" download="lazy" part="commons" size="297085"/>
    ...
    <jar href="lib/trident-6.0.jar" download="lazy" part="core" size="114496"/>
    <property name="jnlp.myProperty" value="*"/>
    <property name="log4j.configuration" value="*"/>
  </resources>

  <application-desc main-class="com.mycom.myapp.MyClass">
  </application-desc>
</jnlp>

......这是我们实际使用的JNLP之一:

<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+" codebase="http://mylocation.mycom.com/jnlp/myapp/" href="myapp.jnlp">
  <information>
    <title>My App - Production version</title>
    <vendor>My vendor</vendor>
    <description>My description</description>
    <icon href="splash.jpg" kind="splash" width="700" height="400" size="115258"/>
    <offline-allowed />
    <shortcut>
      <menu submenu="My submenu"/>
    </shortcut>
  </information>

  <security>
    <all-permissions/>
  </security>

  <resources locale="en es ja">
    <j2se version="1.6+" initial-heap-size="128m" max-heap-size="384m" href="http://java.sun.com/products/autodl/j2se"/>
    <jar href="myjar.jar" main="true" download="lazy" part="core" size="4189501"/>
    <jar href="lib/commons-lang-2.6.jar" download="lazy" part="commons" size="297085"/>
    ...
    <jar href="lib/trident-6.0.jar" download="lazy" part="core" size="114496"/>
    <property name="jnlp.myProperty" value="http://mylocation.mycom.com/jnlp/myapp/MyApp.properties"/>
    <property name="log4j.configuration" value="http://mylocation.mycom.com/jnlp/myapp/log4j.xml"/>
  </resources>

  <application-desc main-class="com.mycom.myapp.MyClass">
  </application-desc>
</jnlp>

请注意我使用通配符(*):

  1. 标记jnlp
  2. 中的codebase属性
  3. 标记jnlp中的href属性
  4. 标题标签内的内容
  5. jar标签中的属性大小
  6. 两个属性的值
  7. 我将模板放在适当的JNLP-INF文件夹中(同样具有相应的名称),然后我们签署了JAR。但是,我们不断收到JNLPSigningException消息,其中包含以下消息:

      

    无法验证启动文件的签名。签名版本与下载的版本不匹配。

    有没有人知道我错过了什么?

4 个答案:

答案 0 :(得分:3)

我遇到了同样的问题,但事实证明,我的src/JNLP-INF/APPLICATION.JNLP文件中包含的.jar文件(用作签名的jnlp文件)与application.jnlp文件不同在<applet>标记中定义的Web应用程序中使用。一旦我做了同样的事情,错误就消失了。

谨慎使用.jar文件中的签名JNLP文件,该文件需要精确命名为JNLP-INF/APPLICATION.JNLP,因为它用作模板以匹配应用程序中调用的jnlp:

答案 1 :(得分:0)

我相信它对标签中的通配符不满意。 我遇到了这种情况。 出于测试目的,我删除了通配符并阻塞了另一个值。 工作得很好 - 但这是不可接受的解决方案,因为这是财产的全部要点!

答案 2 :(得分:0)

我在Java 1.7.0_45上就自签名战争遇到了这个问题,解决方案是删除没有jnlp的属性。字首。在你的情况下尝试删除:

<property name="log4j.configuration" value="http://mylocation.mycom.com/jnlp/myapp/log4j.xml"/>

答案 3 :(得分:0)

作为调试提示,我发现从命令行运行javaws -verbose和jnlp文件的url会在Console选项卡中为您提供额外的详细信息。