jarsigner:此jar包含未验证证书链的条目

时间:2011-12-05 15:53:27

标签: java jarsigner

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

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

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.

我还在JDK 1.6u26和1.6u14上使用与上面相同的JAR尝试了jarsigner -verify命令,它恢复正常。 (从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所需的额外步骤?

8 个答案:

答案 0 :(得分:76)

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

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

jarsigner -verify -keystore xxxx.jks mysignedjar.jar

答案 1 :(得分:49)

缺少任何东西,你肯定单独解决这个问题。经过近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而没有任何警告,我相信这是你所期望的。

答案 2 :(得分:18)

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

如果你真的不想忽略它,那么在验证时告诉jarsigner密钥库的位置。

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

这只是JDK 7中的一项新功能。

答案 3 :(得分:5)

我在" DigiCert SHA2保证ID代码签名CA"中遇到了类似的问题。所有oracle java版本以及OpenJDK都表现相同。 Digicert的支持将我重定向到了这个页面,但这里没有任何说明也帮助我完成了验证过程。

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

使用SHA2而不是SHA1使用证书时,主要问题似乎是keytool中的一个错误,因为在SHA1证书上应用的相同步骤列表始终有效,对我来说从不适用于SHA2。在我看来,keytool无法检测"可链接性"导入到jks的证书因此jarsigner没有将正确的证书链嵌入到签名的jar中,只有最终证书存储在META-INF / myalias.RSA文件中(可由openssl pkcs7 -in myalias.RSA -print_certs验证 - 告知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似乎只包含我的证书,而不是DigiCertCA2或根据keytool -list命令列出的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可以验证最终浏览器用户。

答案 4 :(得分:2)

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

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

答案 5 :(得分:2)

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

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

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

答案 6 :(得分:0)

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

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

  

问题:

     

您收到一条错误消息,指出您的SLL证书   由于缺少Basic Constraints字段,验证失败。

     

解决方案:

     

2009年,Entrust重新发布了包含2048位根证书   基本约束字段(cn = Entrust.net证书颁发机构   (2048),有效期至7/24/2029)。 Entrust已经停止推出了   通过Windows和Java中的根更新原始的2048位根   (从1.6版更新22开始)。更新的根证书   包含基本约束可以在这里找到:

     

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

答案 7 :(得分:0)

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

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

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