我已经为此奋斗了几天,完全陷入了困境。以下是摘要:

  • 我有一个使用Tycho的Eclipse插件项目,可通过Maven 3进行构建
  • 在Maven中,我已经设置了maven-jarsigner-plugin以使用我的 keystore 对jar进行签名(有关 keystore 的详细信息,请参见下文)
  • 我在我的 keystore
  • 中有一个由Thawte签名的代码签名证书。

    我可以从target/*获取任何签名的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对项目进行签名,并且无论我在哪个jar上签名,它都始终在Java6中进行验证而从不在Java7中进行验证。

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

    显然,我不能让我的插件的每个用户都使用我的 keystore 文件,所以这不是解决方案。但是,这确实加强了我在Java 7中存在证书链的问题。

    最佳答案

    问题的答案是,您正在使用SUN作为 key 存储库提供程序,因此在Oracle购买SUN之前发布了Java 6,而在之后购买了许多Sun软件包,则发布了Java 7。您可以验证此here

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

    Oracle撰写了很长的详细说明,说明为什么不应该使用SUN提供程序在其网站上的JCA Documentation中进行安全签名。

    唯一可以“解决”此问题的方法是将您的 keystore 提供程序更改为oracle可接受的,您可以在与上述链接的同一安全性文档中找到它们。

    希望能有所帮助。

    关于java - jarsigner -verify在Java 6中有效,但在Java 7中无效,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18281129/

    10-10 16:35