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

时间:2013-08-16 19:53:24

标签: java keytool jarsigner

我几天来一直在撞击这头,我完全被难过了。这是纲要:

  1. 我有一个Eclipse插件项目,使用Tycho来构建Maven 3
  2. 在Maven中我已经设置了maven-jarsigner-plugin来使用我的密钥库签名罐子(参见下面的密钥库详细信息)
  3. 我已经获得了Thawte在我的密钥库中签名的代码签名证书
  4. 我可以从目标/ *获取任何已签名的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的机器,因此它不是this issue

    我也不相信它是基于算法的,如this issue中所述,因为我可以使用Java 6或Java 7对项目进行签名,并且总是在Java6和< em> never 在Java7中进行验证,无论我使用哪个环境签署了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上使用以下命令验证jar:

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

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

3 个答案:

答案 0 :(得分:8)

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

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

Oracle编写了一篇很长的详细说明,说明为什么不应在其网站JCA Documentation上使用SUN提供商进行安全签名。

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

希望有所帮助。

答案 1 :(得分:4)

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

Java 7正在打印警告。

答案 2 :(得分:3)

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

  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(或任何需要的自动化)在构建期间签署项目。