当前位置: 首页 > 知识库问答 >
问题:

jarsigner-vale可以在Java6中工作,但不能在Java7中工作

云鸿祯
2023-03-14

几天来,我一直在用头撞这个,完全被难倒了。下面是纲要:

  1. 我有一个Eclipse插件项目,使用Tycho通过Maven 3构建
  2. 在Maven中,我已经设置了maven-jarsigner-plugin来使用我的keystore对jars进行签名(有关keystore的详细信息,请参阅下文)
  3. 我的密钥库里有个Thawte签名的代码签名证书

我可以从目标/*中获取任何签名的jar文件,并在上面运行“jarsigner-验证”。这就是发生的事情:

#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的机器,所以这不是问题所在

我也不相信它是基于算法的,正如本期所述,因为我可以使用Java 6或Java 7对项目进行签名,而且它总是使用Java 6进行验证,而从不使用Java 7进行验证,无论我使用哪个环境签署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

显然,我不能让我的插件的每个用户都使用我的密钥库文件,所以这不是一个解决方案。然而,它确实强调了我在Java7中有一个证书链问题。思想?

共有3个答案

幸弘光
2023-03-14

几个月后,我碰巧找到了自己问题的答案。对于任何有同样问题的人,以下是我做的:

>

  • 将现有私钥和CA签名证书转换为pkcs12格式(这是必需的,因为Java的keytool不允许直接导入这些项目)。这可以通过一个openssl命令完成:

    openssl pkcs12 -export -name signing -in signing.cert -inkey myPrivateKey.key -out keystore.p12
    

    其中signing是我的pkcs12密钥库的名称,signing。cert是我的CA提供的签名证书,以及(显然)我的私钥。密钥是我用于签署证书请求的私钥。

    将新创建的密钥库导入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(或任何需要自动化的插件)在构建过程中签名您的项目。

  • 娄嘉石
    2023-03-14

    它确实有效。在这两种情况下,您都会得到“jar验证”=

    Java 7正在打印警告。

    卫宁
    2023-03-14

    问题的答案是,您正在使用SUN作为密钥库提供程序,java 6是在甲骨文购买SUN之前发布的,java 7是在甲骨文购买SUN之后发布的,许多Sun包现在都不建议使用。您可以在这里验证这一点。

    Oracle一直支持不推荐的SUN密钥库提供程序,但现在要求发出警告,就像您使用了任何不推荐的功能一样。

    Oracle在其网站上的JCA文档中详细描述了为什么不应该使用SUN provider进行安全签名。

    唯一能“修复”这个问题的方法是将密钥库提供程序更改为oracle可接受的密钥库提供程序,您可以在上面链接的相同安全文档中找到它们。

    希望有帮助。

     类似资料:
    • 问题内容: 已解决:问题是Wingware Python IDE。我想现在自然而然的问题是,这是怎么可能的以及如何解决。 昨天我问了一个问题Python中的multiprocessing.Pool问题,这个问题几乎相同,但是我发现它似乎可以在Windows计算机上运行,​​而不能在我的Ubuntu上运行。在本文的结尾,我将发布执行相同功能的代码的稍有不同的版本。 我的问题的简短摘要:在Python

    • 我能够登录我的本地(和远程服务器)与以下curl(我用Postman生成)...我可以登录成功使用另一个API客户端(Rest)与我试图在Postman中使用相同的参数/头/体。我已经关闭了SSL证书验证和发送邮递员令牌头设置(每其他堆栈溢出答案)... 卷曲: Curl-X POST\http://localhost:8080/api/user/login\-H'接受:应用程序/json'\-H

    • 我试图做一个文件上传到一个链接(共享点Rest服务),在chrome浏览器中工作良好,但不是在android WebView。 我知道android webview有很多限制,但我尝试使用以下方法上传一个文件 https://github.com/mgks/os-fileup 它打开浏览器,但它不显示文件名,也不上传任何内容或调用服务,但同样的代码在chrome浏览器中运行良好(请注意,我已经启用

    • 这就是我正在做的。 部署此应用程序在 jboss 中失败,因为它在 tomcat 中部署,并且像 charm 一样工作。 我使用来自eclipse的动态web应用程序作为项目源。 将项目导出到war文件并在jboss服务器中部署也不起作用。 web.xml: Spring.xml: 控制器: 和 JBOSS 中的错误:

    • 正在更新属性文件:/home/mehmet/works/netbeansprojects/hsm_java/build/built-clean.属性删除目录/home/mehmet/works/netbeansprojects/hsm_java/build 清洁: 初始化: 已创建目录:/home///netbeansprojects/hsm_java/build/empty 已创建目录:/hom

    • 请求在Postman/Java中失败,但在RESTClient中工作…以下是请求,并附上错误的截图。 这是一个POST请求 {“username”:“test”,“password”:“test”,“simulate_user”:“test”,“sourcetabledesc”:“testlist100”,“联系人”:[{“组织”:“ckt”,“workphone”:“12315423”,“fir