Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java jarsigner:此jar包含证书链未验证的条目_Java_Jarsigner - Fatal编程技术网

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

Java jarsigner:此jar包含证书链未验证的条目,java,jarsigner,Java,Jarsigner,我试图对JAR文件进行代码签名,并使用JDK1.7u1。我们获得了GoDaddy代码签名证书,我按照说明(方法1)进行操作: 但是,每当我尝试运行命令时,JAR信号良好: jarsigner-使用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,

我试图对JAR文件进行代码签名,并使用JDK1.7u1。我们获得了GoDaddy代码签名证书,我按照说明(方法1)进行操作:

但是,每当我尝试运行命令时,JAR信号良好:
jarsigner-使用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.
我也在JDK1.6u26和1.6u14上使用与上面相同的JAR尝试了
jarsigner-verify
命令,结果很好。(输出低于1.6u26)


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

您没有遗漏任何内容,而且您肯定不会独自处理此问题。经过近12个小时的努力,我发现问题的根源在于将
jdk1.7
中的二进制文件与较旧版本的Java(如
JRE-1.6
)混合使用。更准确地说,
keytool
附带
JRE
,而
JDK
附带
keytool
jarsigner


因此,为了解决这个问题,我已经从我的系统中完全卸载了
JDK-1.7
,并安装了
JDK-1.6更新30
。现在,如果我做
jarsigner-verify-verbose-certs blah.jar
,它将在没有任何警告的情况下生成
jar-verifyed
,我相信这是您所期望的。

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

要解决此问题,请执行以下操作:

jarsigner -verify -keystore xxxx.jks mysignedjar.jar
我发现,如果您使用JRE 1.7.0_21对jar文件进行签名,并使用较低版本的JRE 1.7.0对其进行验证,也会打印消息“This jar contains entries whichs certificate chain not validate”


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

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

如果您确实不想忽略它,那么在验证时告诉jarsigner您的密钥库在哪里

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

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

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

问题:

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

解决方案:

2009年,委托重新发布了2048位根证书,包括 基本约束字段(cn=委托.net证书颁发机构 (2048),有效期至2029年7月24日)。托拉斯已经停止推出新产品 Windows和Java中原始的2048位根目录到根目录更新 (从版本1.6更新22开始)。更新的根证书 包含基本约束的内容可在此处找到:


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

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


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

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

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


这是该功能的门票,目的是鼓励时间戳,我相信这将是有效的。

我对“DigiCert SHA2有保证的ID代码签名CA”也有类似的问题“。所有oracle java版本以及OpenJDK的行为都相同。Digicert支持人员将我重定向到此页面,但此处所述内容对我的验证过程也没有帮助

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

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

Digicert建议“……我们有时会看到根目录在第一次导入时没有正确或完全导入,但运行再次指向根目录的导入命令可以解决此问题”,即使在我的情况下,这也没有帮助

由于无法向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命令列出时),而是使用-v(verbose)公开链深度及其证书:

~/$ 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对最终的浏览器用户也是可验证的。

您的答案是正确的,它一定是完美的答案。感谢与ant/JDK 1.7/jarsigner进行了数小时的斗争后,这实际上是JDK 1.7中的一个警告,请看,Oracle做了一些更改当它收购Sun时,它决定发布更多的警告,比如
~/$ 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]: