jarsigner -verify适用于Java 6,但不适用于Java 7

几天来,我一直在抨击我的头,我完全被难倒了。 这是破败的:

  1. 我有一个Eclipse插件项目,使用Tycho来构建Maven 3
  2. 在Maven中我已经设置了maven-jarsigner-plugin来使用我的密钥库来签名jar(请参阅下面的密钥库详细信息)
  3. 我有一个代码签名证书,由Thawte在我的密钥库中签名

我可以从目标/ *获取任何已签名的jar文件,并在其上运行’jarsigner -verify’。 这是发生的事情:

#java 6 on a VM vagrant@test2:/vagrant/com.example.plugins.eclipse/target$ jarsigner -verify com.example.eclipse-0.1.3-SNAPSHOT.jar jar verified. 

下一个:

 #java 7 on a completely different vm vagrant@test1:/vagrant$ jarsigner -verify com.example.eclipse-0.1.3-SNAPSHOT.jar jar verified. Warning: This jar contains entries whose certificate chain is not validated. Re-run with the -verbose and -certs options for more details. 

我注意不要使用安装了Java6和Java7的机器,因此不是这个问题

我也不相信它是基于算法的,如本期所述 ,因为我可以使用Java 6或Java 7对项目进行签名,它始终在Java6中进行validation, 从不在Java7中进行validation,无论我使用哪个环境签署了jar 。

这是keytool -list的输出

 Keystore type: JKS Keystore provider: SUN Your keystore contains 3 entries root, Aug 11, 2013, trustedCertEntry, Certificate fingerprint (SHA1): 91:C6:D6:EE:3E:8A:C8:63:84:E5:48:C2:99:29:5C:75:6C:81:7B:81 intermediate, Aug 11, 2013, trustedCertEntry, 

我不得不相信这是一个证书链问题,因为我能够在Java 7上使用以下命令validationjar:

 jarsigner -verify -keystore keystore com.example.eclipse-0.1.3-SNAPSHOT.jar 

显然我不能使用我的密钥库文件让我的插件的每个用户,所以这不是一个解决方案。 但是,它强调我在Java 7中有一个证书链问题。思想?

您的问题的答案是您使用SUN作为您的密钥库提供程序java 6是在oracle购买SUN之前发布的,并且之后发布了Java 7,现在许多Sun软件包已被弃用。 你可以在这里validation这一点 。

Oracle一直支持已弃用的SUN密钥库提供程序,但现在要求发出警告,就像使用任何已弃用的function一样。

Oracle编写了一篇详细的描述,说明为什么不应在其网站上的JCA文档中使用SUN提供程序进行安全签名。

唯一可以“修复”这一点的是将密钥库提供程序更改为oracle可接受的,您可以在链接到上面的相同安全文档中找到它们。

希望有所帮助。

它确实有效。 在两种情况下都得到“jarvalidation”=>在两种情况下都validation了JAR。 这意味着JAR由其声称签署的人签署,并且JAR未被随后篡改。

Java 7正在打印警告。

几个月后,我碰巧找到了自己问题的答案。 对于有同样问题的其他人,这就是我所做的:

  1. 将现有的私钥和CA签名的证书转换为pkcs12格式(这是必需的,因为Java的keytool不允许直接导入这些项目)。 这可以在一个openssl命令中完成:

     openssl pkcs12 -export -name signing -in signing.cert -inkey myPrivateKey.key -out keystore.p12 

    如果签名是我的pkcs12密钥库的名称,则signing.cert是我提供的CA签名证书,并且(显然)myPrivateKey.key是用于签署证书请求的私钥。

  2. 将此新创建的密钥库导入Java密钥库:

     keytool -importkeystore -destkeystore keystore -srckeystore keystore.p12 -srcstoretype pkcs12 -alias signing 
  3. 将CA的Java证书导入密钥库。 我不确定这有什么神奇之处,但如果没有它,就不会遵循证书链(即使手动添加中间证书)。 此证书通常通过您的签名证书到达的电子邮件提供。对于我们的目的,它称为signing.pkcs7。

     keytool -importcert -file signing.pkcs7 -keystore keystore -v -alias signing 

    您必须输入创建Java密钥库时使用的密钥库密码。

  4. 使用maven-jarsigner-plugin(或任何需要的自动化)在构建期间签署您的项目。