48

我正在尝试对 JAR 文件进行代码签名并使用 JDK 1.7u1。我们获得了 GoDaddy 代码签名证书,我按照此处的说明(方法 1)进行操作:http: //help.godaddy.com/article/4780

JAR 签名很好,但是每当我尝试运行命令时: jarsigner -verify在我使用 JDK 1.7u1 签名的 JAR 上,我得到以下输出:

s        180 Mon Dec 05 10:24:32 EST 2011 META-INF/MANIFEST.MF

      [entry was signed on 12/5/11 10:24 AM]
      X.509, CN=Removed Company Name, O=Removed Company Name, L=Removed City, ST=Removed State, C=US
      [certificate is valid from 12/2/11 4:30 PM to 12/2/13 4:30 PM]
      X.509, SERIALNUMBER=00000000, CN=Go Daddy Secure Certification Authority, OU=http://certificates.godaddy.com/repository, O="GoDaddy.com, Inc.", L=Scottsdale, ST=Arizona, C=US
      [certificate is valid from 11/15/06 8:54 PM to 11/15/26 8:54 PM]
      X.509, OU=Go Daddy Class 2 Certification Authority, O="The Go Daddy Group, Inc.", C=US
      [certificate is valid from 6/29/04 1:06 PM to 6/29/34 1:06 PM]
      [CertPath not validated: null]

         342 Mon Dec 05 10:24:34 EST 2011 META-INF/JAVACSC.SF
        6180 Mon Dec 05 10:24:34 EST 2011 META-INF/JAVACSC.RSA
           0 Mon Dec 05 10:24:30 EST 2011 META-INF/
sm      2161 Wed Nov 30 10:23:20 EST 2011 C:/Users/Seth/Desktop/JAR/RunAppSF.class

      [entry was signed on 12/5/11 10:24 AM]
      X.509, CN=Removed Company Name, O=Removed Company Name, L=Removed City, ST=Removed State, C=US
      [certificate is valid from 12/2/11 4:30 PM to 12/2/13 4:30 PM]
      X.509, SERIALNUMBER=00000000, CN=Go Daddy Secure Certification Authority, OU=http://certificates.godaddy.com/repository, O="GoDaddy.com, Inc.", L=Scottsdale, ST=Arizona, C=US
      [certificate is valid from 11/15/06 8:54 PM to 11/15/26 8:54 PM]
      X.509, OU=Go Daddy Class 2 Certification Authority, O="The Go Daddy Group, Inc.", C=US
      [certificate is valid from 6/29/04 1:06 PM to 6/29/34 1:06 PM]
      [CertPath not validated: null]


  s = signature was verified 
  m = entry is listed in manifest
  k = at least one certificate was found in keystore
  i = at least one certificate was found in identity scope

jar verified.

Warning: 
This jar contains entries whose certificate chain is not validated.

我还在jarsigner -verifyJDK 1.6u26 和 1.6u14 上使用与上述相同的 JAR 尝试了该命令,结果恢复正常。(下面来自 1.6u26 的输出)。

         180 Mon Dec 05 10:24:32 EST 2011 META-INF/MANIFEST.MF
         342 Mon Dec 05 10:24:34 EST 2011 META-INF/JAVACSC.SF
        6180 Mon Dec 05 10:24:34 EST 2011 META-INF/JAVACSC.RSA
           0 Mon Dec 05 10:24:30 EST 2011 META-INF/
sm      2161 Wed Nov 30 10:23:20 EST 2011 C:/Users/Seth/Desktop/JAR/RunAppSF.class

      [entry was signed on 12/5/11 10:24 AM]
      X.509, CN=Removed Company Name, O=Removed Company Name, L=Removed City, ST=Removed State, C=US
      [certificate is valid from 12/2/11 4:30 PM to 12/2/13 4:30 PM]
      X.509, SERIALNUMBER=00000000, CN=Go Daddy Secure Certification Authority, OU=http://certificates.godaddy.com/repository, O="GoDaddy.com, Inc.", L=Scottsdale, ST=Arizona, C=US
      [certificate is valid from 11/15/06 8:54 PM to 11/15/26 8:54 PM]
      [KeyUsage extension does not support code signing]
      X.509, OU=Go Daddy Class 2 Certification Authority, O="The Go Daddy Group, Inc.", C=US
      [certificate is valid from 6/29/04 1:06 PM to 6/29/34 1:06 PM]


  s = signature was verified 
  m = entry is listed in manifest
  k = at least one certificate was found in keystore
  i = at least one certificate was found in identity scope

jar verified.

我是否错过了为 JDK 1.7 正确签署 JAR 所需采取的额外步骤?

4

8 回答 8

90

我遇到了同样的问题,如果它可以帮助其他人,问题在于 jarsigner 如何找到密钥库。

为了解决问题,请执行以下操作:

jarsigner -verify -keystore xxxx.jks mysignedjar.jar
于 2012-05-12T15:36:51.320 回答
50

没有遗漏任何东西,而且您绝对不是唯一一个遇到这个问题的人。经过将近 12 个小时的挣扎,我发现问题的根源在于将二进制文件JDK 1.7与较旧版本的 Java 混合,例如JRE-1.6. 更准确地说,keytool附带JRE,同时JDK附带keytooljarsigner

所以,为了解决这个问题,我已经JDK-1.7从我的系统中完全卸载并安装了JDK-1.6 Update 30. 现在,如果我这样做jarsigner -verify -verbose -certs blah.jar,它会在jar verified没有任何警告的情况下产生,我相信这是你所期望的。

于 2011-12-16T05:42:57.643 回答
22

这只是一个你可以忽略的警告。

如果您真的不想忽略它,请在验证时告诉 jarsigner 您的密钥库在哪里。

jarsigner -verbose -verify -keystore ${KEYSTORE_PATH} ${YOUR_JAR_FILE}

这只是 JDK 7 中的一个新特性。

于 2013-09-12T08:00:31.370 回答
8

我对“DigiCert SHA2 Assured ID Code Signing CA”有类似的问题。所有 oracle java 版本以及 OpenJDK 的行为都相同。Digicert 支持将我重定向到此页面,但此处说明的任何内容都没有帮助我完成验证过程。

我正在尝试签署一个小程序,所以我需要它在浏览器中也是可验证的,因此向 jarsigner -verify 提供密钥库路径的技巧不适用。

当使用 SHA2 而不是 SHA1 操作证书时,主要问题似乎是 keytool 中的一个错误,因为应用于 SHA1 证书的相同步骤列表始终有效,并且对我来说从未适用于 SHA2。在我看来,keytool 无法检测导入到 jks 的证书的“可链接性”,因此 jarsigner 没有将正确的证书链嵌入到签名的 jar 中,只有最终证书存储在 META-INF/myalias 中。 RSA 文件(可通过 openssl pkcs7 -in myalias.RSA -print_certs -inform DER -out certs.crt 验证)。

Digicert 建议“ ......我们有时会看到 Root 的问题实际上并没有在第一次正确或完全导入,但是运行再次指向 Root 的导入命令可以解决这个问题”,即使这对我的情况也没有帮助。

由于无法向 keytool 明确说明链中将包含哪些证书,因此我决定使用 openssl 构建一个链并像这样导入它:

cat TrustedRoot.pem DigiCertCA2.pem my.crt  >chain
openssl pkcs12 -nodes -export -in my.crt  -inkey my.key -out tmp.p12 -name myalias -certfile chain
keytool -importkeystore -destkeystore mykeystore.jks -srckeystore tmp.p12 -srcstoretype PKCS12

在此 mykeystore.jks 似乎只包含我的证书之后,当 keytool -list 命令列出时,不包含 DigiCertCA2 或 Root,但使用 -v (详细)它揭示了链深度及其证书:

~/$ keytool  --list --keystore mykeystore.jks  -v|grep -e chain -e Certificate\\[
Enter keystore password:  123456
Certificate chain length: 3
Certificate[1]:
Certificate[2]:
Certificate[3]:

这就是 jarsigned 需要正确签署 jar 的内容,即嵌入正确的证书链并使 jar 也可用于最终浏览器用户。

于 2015-03-18T12:51:26.390 回答
2

我发现如果您使用 JRE 1.7.0_21 对 Jar 文件进行签名并使用较低版本的 JRE 1.7.0 进行验证,也会打印消息“此 jar 包含未验证证书链的条目”。

结论:无需降级到 Java 1.6,只需使用相同的 jarsigner 版本进行签名和验证即可。

于 2013-08-15T08:47:31.883 回答
2

这是 JDK 7+ 中的一种安全机制。这会在签署没有时间戳的 jar 时打印警告,可以使用 -tsa 标志传递。如果 jar 没有时间戳,它将在其有效期过后停止工作。

如果您正在构建 Android 目标,如果您使用的 JDK 版本高于 1.7.0_51,则始终会打印此警告。Android 一般建议通过 30 年有效期,因此可以 100% 忽略此警告,除非您的商业计划是允许用户在 2046 年使用相同的 .apk。

这是该功能的门票,目的是鼓励时间戳,我相信这会有效。http://bugs.java.com/view_bug.do?bug_id=8023338

于 2015-01-15T15:29:15.157 回答
0

如果您的证书来自 Entrust,请确保您使用的是较新的根证书。

http://www.entrust.net/knowledge-base/technote.cfm?tn=7875

问题:

您收到一条错误消息,指出您的 SLL 证书验证由于缺少基本约束字段而失败。

解决方案:

2009 年,Entrust 重新发布了 2048 位根证书,包括 Basic Constraints 字段(cn=Entrust.net Certification Authority (2048),有效期至 2029 年 7 月 24 日)。Entrust 已停止通过 Windows 和 Java 中的根更新(从版本 1.6 更新 22 开始)推出原始 2048 位根。可以在此处找到包含基本约束的更新根证书:

https://www.entrust.net/downloads/binary/entrust_2048_ca.cer

于 2013-10-17T00:07:54.833 回答
0

当您创建/导出证书到 p12(由 jarsigner 使用)时,请确保您确保选择了以下内容(例如,如果您使用 Internet Explorer 向导导出),您将需要在导出向导中选择以下内容。

“导出私钥” “如果可能,包括证书路径中的所有证书” “导出所有扩展属性”在选项 .PFX 或 PKCS #12 下选中。

如果您首先正确地创建了 p12,那么 jarsign 不需要特别的努力。

于 2014-07-09T00:18:16.327 回答