【问题标题】:jarsigner -verify works in Java 6 but not Java 7jarsigner -verify 适用于 Java 6 但不适用于 Java 7
【发布时间】:2013-08-19 07:42:46
【问题描述】:

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

  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的机器,所以它不是this issue

我也不相信它是基于算法的,如 this issue 中所述,因为我可以使用 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,

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

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

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

【问题讨论】:

  • 您可以使用 -verbose 和 -certs 选项重新运行并发布输出吗?

标签: java keytool jarsigner


【解决方案1】:

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

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

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

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

希望对您有所帮助。

【讨论】:

    【解决方案2】:

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

    Java 7 正在打印一个警告。

    【讨论】:

    • 当证书链无法验证时,我认为它不起作用。
    • jarsigner -verify 为我工作,没有该消息。您的证书链可能不适合您,单独的问题。
    • 证书链不是一个单独的问题,它是 问题。 jarsigner 工具在提供体面的信息跟踪方面很糟糕,我正在寻找调试它的建议。
    【解决方案3】:

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

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

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

      signing 是我的 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(或任何需要自动化的工具)为您的项目签名。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-19
      • 2014-04-06
      • 1970-01-01
      • 1970-01-01
      • 2013-06-12
      • 1970-01-01
      • 2013-11-20
      • 1970-01-01
      相关资源
      最近更新 更多