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