【问题标题】:jarsigner: This jar contains entries whose certificate chain is not validatedjarsigner:此 jar 包含未验证证书链的条目
【发布时间】:2012-01-13 08:25:21
【问题描述】:

我正在尝试对 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.

我还在 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 所需采取的额外步骤?

【问题讨论】:

    标签: java jarsigner


    【解决方案1】:

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

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

    jarsigner -verify -keystore xxxx.jks mysignedjar.jar
    

    【讨论】:

    • 你的答案是正确的,它一定是完美的答案。谢谢
    • 经过数小时与 ant/JDK 1.7/jarsigner 的斗争,这实际上是 JDK 1.7 中出现的警告,看,Oracle 在收购 Sun 时做了一些更改,它决定发出更多警告,例如那些。还有一个蚂蚁没有将正确的开关发送到 jarsigner 的问题,我相信这在 android target 19(至少)中得到了解决。有趣的是,它现在验证了两个 APK 是否正常,每个 APK 都使用不同的算法签名,因此无助于确定 ant/jdk1.7/android 是否有效。
    【解决方案2】:

    没有遗漏任何东西,而且您绝对不是一个人遇到这个问题。经过将近 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,我相信这就是您所期望的。

    【讨论】:

    • 这个解决方案很糟糕......首先:这只是一个警告其次:如果你真的希望它消失,解决方案是告诉它密钥库在哪里添加 -keystore 验证命令
    • 谢谢!!!仅供参考 - 下载链接在这里:oracle.com/technetwork/java/javasebusiness/downloads/…
    【解决方案3】:

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

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

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

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

    【讨论】:

    • 你的绝对正确......添加带有路径的 -keystore 标志,你会看到你有一个有效的 jar 文件
    • 下载 JAR 的客户端将无法访问密钥库路径,但会通过链向根 CA 进行验证。 IE。您已使用根 CA 颁发的证书签署了 JAR,并且客户端无法在没有密钥库的情况下直接验证您的证书,但它可以验证链并验证根 CA,因为它将预安装在本地客户端 java 签名者 CA。似乎针对密钥库进行验证就像假设证书将安装在本地客户端上,但它不会,只有根 CA 会。客户端不会还有链的问题吗?
    【解决方案4】:

    我对“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 也可供最终浏览器用户验证。

    【讨论】:

    • 这对我很有帮助。非常感谢您发布它
    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

      这是 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.

      【讨论】:

        【解决方案7】:

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

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

        问题:

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

        解决方案:

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

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

        【讨论】:

          【解决方案8】:

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

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

          如果你一开始就正确地创建了 p12,那么 jarsign 就不需要特别的努力了。

          【讨论】:

            猜你喜欢
            • 2011-12-24
            • 2020-04-14
            • 2018-06-03
            • 2011-03-16
            • 2012-05-11
            • 1970-01-01
            • 2017-08-15
            • 2021-09-12
            • 1970-01-01
            相关资源
            最近更新 更多