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

Jas*_*ols 5 java keytool jarsigner

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

  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.
Run Code Online (Sandbox Code Playgroud)

下一个:

#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.
Run Code Online (Sandbox Code Playgroud)

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

我也不相信它是基于算法的,如本期所述,因为我可以使用Java 6或Java 7对项目进行签名,它始终在Java6中进行验证,从不在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,
Run Code Online (Sandbox Code Playgroud)

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

jarsigner -verify -keystore keystore com.example.eclipse-0.1.3-SNAPSHOT.jar
Run Code Online (Sandbox Code Playgroud)

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

小智 8

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

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

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

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

希望有所帮助.


Jas*_*ols 3

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

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

    openssl pkcs12 -export -name signing -in signing.cert -inkey myPrivateKey.key -out keystore.p12
    
    Run Code Online (Sandbox Code Playgroud)

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

  2. 将这个新创建的密钥库导入到 Java 密钥库中:

    keytool -importkeystore -destkeystore keystore -srckeystore keystore.p12 -srcstoretype pkcs12 -alias signing
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将 CA 的 Java 证书导入密钥库。我不太确定这有什么魔力,但如果没有它,证书链就不会被遵循(即使手动添加中间证书)。该证书通常通过您的签名证书所在的电子邮件提供。出于我们的目的,它被称为signing.pkcs7。

    keytool -importcert -file signing.pkcs7 -keystore keystore -v -alias signing
    
    Run Code Online (Sandbox Code Playgroud)

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

  4. 使用 maven-jarsigner-plugin (或任何需要自动化的工具)在构建过程中对项目进行签名。