jnlp中的jar资源未使用相同的证书进行签名

17

我已经使用Web Start工作了几年,并且有签署JAR等经验。现在我正在尝试使用Web Start部署RCP应用程序,虽然我确实使用相同的证书对所有JAR进行了签名,但仍然出现以下错误:“jnlp中的jar资源未使用相同的证书签名”

是否有其他人遇到过这个问题?如果是这样,有没有任何解决方法?

7个回答

13

我曾经遇到类似的问题,检查了JAR包后发现某个第三方JAR包被其他人签名。

你应该为被其他证书签名的JAR包创建一个单独的jnlp文件,并从你的jnlp文件中读取这个jnlp文件:

<resources>
  ...
  <extension name="other" href="other.jnlp"/>
</resources>

这里或者这里可以找到一个示例。


2
我也遇到了同样的问题。与其使用扩展程序,我编写了一个小脚本来从第三方JAR文件中剥离签名文件(例如META-INF / * .RSA,* .DSA和* .SF),然后再自己对它们进行签名。 - qualidafial
2
如果您不需要原始签名,那就没关系。但有时候您是需要的。 - asalamon74
1
Kiril的链接应该是这个:http://weblogs.java.net/blog/kirillcool/archive/2005/05/signing_jars_fo.html - Asaf
这不起作用,因为它会显示错误jar资源未由相同的证书签名,这很明显,因为第三方jar将由各自的人签名。 - Vijay

4
以下脚本列出了在 /some/lib 目录中每个 jar 文件中的 RSA 证书序列号,有助于找到由错误证书签名的 jar 文件:
for f in $( find /some/lib -type f -name '*.jar' )
do 
   serial=$( unzip -p $f 'META-INF/*.RSA' | 
             openssl pkcs7 -inform der -print -noout |
             grep --max-count=1 serialNumber | cut -d: -f2- | tr -d ' ' )
   printf "%40s: %s\n" "$serial" "$f"
done

很棒的脚本。帮助我找到了哪个JAR有不同的签名。 - Anu Shibin Joseph Raj

3
我发现JNLP/Webstart不喜欢使用jarsigner.exe对同一个JAR文件进行多次签名/签署。如果像BouncyCastle这样的JAR文件(已经预先签名)再次使用公司证书进行签名,视觉检查会使我相信新证书和签名已经正确地执行在JAR文件中。但是,JNLP可能只读取META-INF中的第一个(按字母顺序?)签名,并抱怨它与其他JAR文件不匹配(每个JAR文件上只有一个企业签名)。

我可以确认这一点。同样的问题:Eclipse提供的JAR现有签名(以_E_开头),以及添加的以_V_开头的签名。该签名对于我的证书是正确的,但是JNLP似乎会与Eclipse证书进行检查。 - Kariem

3

这可能是您使用作为库的已签名jar中的过时清单条目。我通过webstart遇到了jogl的这个问题。请尝试以下操作:

解压缩所有的jar文件,清除所有的META-INF目录,然后再次打包和签名它们。


2
我曾经遇到和Matthew描述的一模一样的问题,即使用预签名的BouncyCastle JAR包时出现错误。但是,我发现JRE 1.6.0_14及更高版本可以轻松接受具有多个签名的JAR包(正如我所期望的那样)。因此,我不需要使用上面描述的JNLP“组件扩展机制”。
PS:在1.6.0_14版本的发布说明中没有找到任何明显的修复引用。然而,我已经验证了多个签名的JAR包在所有后续版本中都有效(至少是14-17 + 24)。

2

0
在我的项目中,发生的情况是负载均衡器池中有几个实例,其中一些实例具有旧版本的代码,而另一些实例则具有新版本。因此,存在由不同证书签名的证书...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接