5

几天来我一直在努力解决这个问题,我完全被难住了。这是纲要:

  1. 我有一个使用 Tycho 通过 Maven 3 构建的 Eclipse 插件项目
  2. 在 Maven 中,我设置了 maven-jarsigner-plugin 以使用我的密钥库对 jar 进行签名(有关密钥库的详细信息,请参见下文)
  3. 我的密钥库中有 Thawte 签署的代码签名证书

我可以从 target/* 获取任何签名的 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 中验证,从不在 Java7 中验证,无论我用哪种环境签署了 jars .

这是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 中存在证书链问题。想法?

4

3 回答 3

8

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

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

Oracle在其网站上的JCA 文档中详细说明了为什么您不应该使用 SUN 提供程序进行安全签名。

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

希望有帮助。

于 2013-08-24T09:51:52.373 回答
4

它确实有效。在这两种情况下,您都会得到“jar 验证”=> JAR 在两种情况下都经过验证。这意味着 JAR 是由它声称的签名者签署的,并且 JAR 随后没有被篡改。

Java 7 正在打印警告。

于 2013-08-19T01:00:33.293 回答
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(或任何需要自动化的工具)对项目进行签名。

于 2014-03-31T17:41:15.890 回答