我几天来一直在撞击这头,我完全被难过了。这是纲要:
我可以从目标/ *获取任何已签名的jar文件,并在其上运行'jarsigner -verify'。这就是:
#java 6 on a VM
vagrant@test2:/vagrant/com.example.plugins.eclipse/target$ jarsigner -verify com.example.eclipse-0.1.3-SNAPSHOT.jar
jar verified.
下一步:
#java 7 on a completely different vm
vagrant@test1:/vagrant$ jarsigner -verify com.example.eclipse-0.1.3-SNAPSHOT.jar
jar verified.
Warning:
This jar contains entries whose certificate chain is not validated.
Re-run with the -verbose and -certs options for more details.
我注意不要使用安装了Java6和Java7的机器,因此它不是this issue
我也不相信它是基于算法的,如this issue中所述,因为我可以使用Java 6或Java 7对项目进行签名,并且总是在Java6和< em> never 在Java7中进行验证,无论我使用哪个环境签署了jar。
这是 keytool -list
的输出Keystore type: JKS
Keystore provider: SUN
Your keystore contains 3 entries
root, Aug 11, 2013, trustedCertEntry,
Certificate fingerprint (SHA1): 91:C6:D6:EE:3E:8A:C8:63:84:E5:48:C2:99:29:5C:75:6C:81:7B:81
intermediate, Aug 11, 2013, trustedCertEntry,
我必须相信这是一个证书链问题,因为我能够在Java 7上使用以下命令验证jar:
jarsigner -verify -keystore keystore com.example.eclipse-0.1.3-SNAPSHOT.jar
显然我不能使用我的密钥库文件让我的插件的每个用户都这样,所以这不是解决方案。但是,它强调我在Java 7中有一个证书链问题。想法?
答案 0 :(得分:8)
您的问题的答案是您使用SUN作为您的密钥库提供程序java 6是在oracle购买SUN之前发布的,并且之后发布了Java 7,现在许多Sun软件包已被弃用。您可以验证此here。
Oracle一直支持已弃用的SUN密钥库提供程序,但现在要求发出警告,就像使用任何已弃用的功能一样。
Oracle编写了一篇很长的详细说明,说明为什么不应在其网站JCA Documentation上使用SUN提供商进行安全签名。
唯一可以“解决”这个问题的方法是将密钥库提供程序更改为oracle可接受的密钥库提供程序,您可以在链接到上面的相同安全文档中找到它们。
希望有所帮助。
答案 1 :(得分:4)
确实有效。在两种情况下都得到“jar验证”=&gt;在两种情况下都验证了JAR。这意味着JAR由其声称签署的人签署,并且JAR未被随后篡改。
Java 7正在打印警告。
答案 2 :(得分:3)
将现有的私钥和CA签名的证书转换为pkcs12格式(这是必需的,因为Java的keytool不允许直接导入这些项目)。这可以在一个openssl命令中完成:
openssl pkcs12 -export -name signing -in signing.cert -inkey myPrivateKey.key -out keystore.p12
如果签名是我的pkcs12密钥库的名称,则signing.cert是我提供的CA签名证书,并且(显然)myPrivateKey.key是我用于签署证书请求的私钥。
将这个新创建的密钥库导入Java密钥库:
keytool -importkeystore -destkeystore keystore -srckeystore keystore.p12 -srcstoretype pkcs12 -alias signing
将您的CA的Java证书导入密钥库。我不确定这有什么神奇之处,但如果没有它,则不会遵循证书链(即使手动添加中间证书)。此证书通常通过您的签名证书到达的电子邮件提供。出于我们的目的,它被称为signing.pkcs7。
keytool -importcert -file signing.pkcs7 -keystore keystore -v -alias signing
您必须输入创建Java密钥库时使用的密钥库密码。
使用maven-jarsigner-plugin(或任何需要的自动化)在构建期间签署项目。