是什么阻止Java使用多个签名算法验证签名的jar

Jim*_*imN 18 java jar code-signing java-web-start jarsigner

快速背景: 我们发布了一个webstart应用程序,其中包括我们自己的应用程序罐和众多第三方jar.Webstart要求jnlp文件引用的所有分布式jar都由单个证书签名.因此,我们使用自签名证书签署所有罐子(我们的罐子和第三方罐子).一些第三方罐子已经由生产它们的一方签署,但我们只是再次签署它们,这很好.到现在.

问题: 我们最近从Java 6迁移到Java 7,突然webstart拒绝加载一些jar,抱怨:"无效的SHA1签名文件摘要".这只发生在一些罐子而不是其他罐子上,并且那些失败的罐子似乎有多个签名.

在搜索SO和互联网之后,似乎Java的jarsigner的默认签名算法在Java 6和Java 7之间已经发生了变化,从SHA1到SHA256,并且各种人都建议使用"jarsigner -digestalg SHA1"来解决验证问题.我试过了,果然我们的多重签名罐子验证了.所以这似乎是我们问题的解决方法.

从我可以收集到的内容来看,第三方签名似乎是SHA1签名,我们使用默认签名 - SHA256签名 - 导致签名混合.当我使用'-digestalg'开关强制SHA1时,我们有两个相同类型的签名,验证现在可以正常工作.所以似乎这个问题是由多个签名使用不同的算法引起的?或者还有其他一些我缺失的因素.

问题:

  1. 为什么无法使用SHA1 + SHA256验证,但使用SHA1 + SHA1进行验证?有技术原因吗?安全政策的原因?为什么不能验证两个签名是否正确?
  2. 使用(继续使用)SHA1而不是现在默认的SHA256有什么缺点吗?

Ian*_*rts 7

您可以为每个引用相关jar文件的第三方签名者创建单独的JNLP文件,然后让您的主JNLP使用该<extension>元素依赖于这些文件,而不是自己重新签名第三方jar .所有JAR文件必须由同一签名者签名的限制仅适用于一个JNLP,每个扩展可以具有不同的签名者.

如果做不到这一点,您可以在添加自己的签名之前删除第三方签名(通过重新打包META-INF/*.{SF,DSA,RSA})