代码之家  ›  专栏  ›  技术社区  ›  skiphoppy

如何强制jarsign签署jar文件?

  •  4
  • skiphoppy  · 技术社区  · 16 年前

    我们的产品在Java版本1.5.0y13停止,我们希望升级。我们的软件通过JavaWebSstart部署大量的JAR,所有这些jar都必须签名。但是,一些JAR不包含类文件,并且从Java版本1.5.0Sy14开始,JARNoSnices实用工具选择不签署任何不包含类文件的jar。

    我该怎么做才能强迫Jarsign在这些罐子上签名?或者我可以做什么来通过JavaWebSstart分发这些jar而不签名呢?是否有任何地方记录了对1.5.0版及以上版本jarsign的更改?我找不到它在 release notes .

    6 回复  |  直到 7 年前
        1
  •  9
  •   Vinay Sajip    16 年前

    我无法确认是否有问题。你能看看你的环境有什么不同吗?我在Windows7RC上运行。

    让我们检查一下版本:

    C:\temp>java -version
    java version "1.5.0_14"
    Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_14-b03)
    Java HotSpot(TM) Client VM (build 1.5.0_14-b03, mixed mode, sharing)
    

    让我们看看罐子里会有什么:

    C:\temp>dir /s /b com
    C:\temp\com\rdc
    C:\temp\com\rdc\test
    C:\temp\com\rdc\test\logging.properties
    

    让我们做这个罐子:

    C:\temp>jar -cfv test-source.jar com/*
    added manifest
    adding: com/rdc/(in = 0) (out= 0)(stored 0%)
    adding: com/rdc/test/(in = 0) (out= 0)(stored 0%)
    adding: com/rdc/test/logging.properties(in = 13) (out= 15)(deflated -15%)
    

    让我们在jar上签名:我使用的是自签名证书。

    C:\temp>jarsigner -signedjar test-dest.jar test-source.jar vinay
    Enter Passphrase for keystore:
    
    Warning: The signer certificate will expire within six months.
    

    让我们看看我们签名的罐子里有什么:

    C:\temp>jar tvf test-dest.jar
       155 Wed Jul 15 23:39:12 BST 2009 META-INF/MANIFEST.MF
       276 Wed Jul 15 23:39:12 BST 2009 META-INF/VINAY.SF
      1130 Wed Jul 15 23:39:12 BST 2009 META-INF/VINAY.DSA
         0 Wed Jul 15 23:37:18 BST 2009 META-INF/
         0 Wed Jul 15 19:44:44 BST 2009 com/rdc/
         0 Wed Jul 15 19:44:58 BST 2009 com/rdc/test/
        13 Wed Jul 15 23:37:10 BST 2009 com/rdc/test/logging.properties
    

    好的,它看起来确实已经签名了,而且没有类。让我们看看 MANIFEST.MF :

    Manifest-Version: 1.0
    Created-By: 1.5.0_14 (Sun Microsystems Inc.)
    
    Name: com/rdc/test/logging.properties
    SHA1-Digest: Ob/S+a7TLh+akYGEFIDugM12S88=
    

    以及 VINAY.SF :

    Signature-Version: 1.0
    Created-By: 1.5.0_14 (Sun Microsystems Inc.)
    SHA1-Digest-Manifest-Main-Attributes: 4bEkze9MHmgfBoY+fnoS1V9bRPs=
    SHA1-Digest-Manifest: YB8QKIAQPjEYh8PkuGA5G8pW3tw=
    
    Name: com/rdc/test/logging.properties
    SHA1-Digest: qXCyrUvUALII7SBNEq4R7G8lVQQ=
    

    现在,让我们验证一下jar:

    C:\temp>jarsigner -verify -verbose test-dest.jar
    
             155 Wed Jul 15 23:51:34 BST 2009 META-INF/MANIFEST.MF
             276 Wed Jul 15 23:51:34 BST 2009 META-INF/VINAY.SF
            1131 Wed Jul 15 23:51:34 BST 2009 META-INF/VINAY.DSA
               0 Wed Jul 15 23:37:18 BST 2009 META-INF/
               0 Wed Jul 15 19:44:44 BST 2009 com/rdc/
               0 Wed Jul 15 19:44:58 BST 2009 com/rdc/test/
    smk       13 Wed Jul 15 23:37:10 BST 2009 com/rdc/test/logging.properties
    
      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 signer certificate will expire within
    six months. Re-run with the -verbose and -certs options for more details.
    

    从表面上看,一切都井然有序。您可以检查您的证书是否过期或被吊销吗?您使用的是自签名证书还是真正的证书?还是我误解了你的问题?

        2
  •  2
  •   skiphoppy    16 年前

    对于任何搜索这个问题的人,我们都认为它只影响到后来的Java 1.5版本,从1.5.0S14开始,我相信。它在最新版本的1.5中似乎是固定的,在1.6中肯定是固定的。

        3
  •  1
  •   Joshua    16 年前

    如果需要,可以将虚拟类文件放入。可能令人厌恶,但可能是必要的。

        4
  •  1
  •   Scott McIntyre    16 年前

    顺便说一句,我尝试了和Vinay一样的方法,但是使用了JDK1.5.0 Jarsigner,以及一个合适的Verisign证书,得到了相同的结果。jarsigner工作了,jar使用jarsigner-verify进行了验证。

        5
  •  1
  •   Gnoupi    16 年前

    添加它:我使用JavaWebSstart,我有一个只包含图像的JAR。 有了JDK1.6 U05(也有07、10)和Ant一代,就可以毫无问题地对其进行签名(使用自签名证书)。 因此,像其他描述的那样,它似乎没有链接到包含.class文件的jar。

        6
  •  1
  •   martin clayton egrunin    14 年前

    这是一个远射,但蚂蚁 SignJar task 可能会说服Jarsign做正确的事情。有很多选择可能会打破平衡。

    推荐文章