如何强制jarsigner签署jar文件?

时间:2009-06-10 16:41:52

标签: java jar jarsigner

我们的产品在Java版本1.5.0_13暂停,我们想要升级。我们的软件通过Java Web Start部署了大量的jar;所有这些罐子都必须签名。但是,有几个jar不包含类文件,从Java 1.5.0_14开始,jarsign实用程序似乎选择不签署任何不包含类文件的jar。

我可以做些什么来强制jarsign签署这些罐子?或者我可以做什么来通过Java Web Start分发这些jar而不签名?是否记录了版本1.5.0_14及以上版本的变化?我在release notes中找不到它。

6 个答案:

答案 0 :(得分:9)

我无法确认是否有任何问题。你能看一看,看看你的环境可能有什么不同吗?我在Windows 7 RC上运行。

让我们检查版本:

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%)

让我们签一个罐子:我正在使用自签名证书。

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.

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

答案 1 :(得分:2)

对于搜索此问题的任何人,我们认为它只影响Java 1.5的某些更高版本,即1.5.0_14以后的版本,我相信。它似乎在最新版本的1.5中得到修复,并且在1.6中肯定是固定的。

答案 2 :(得分:1)

如果需要,可以放入虚拟类文件。可能令人反感但也许是必要的。

答案 3 :(得分:1)

这是一个很长的镜头,但是蚂蚁SignJar task或许可以说服jarsign做正确的事。那里有很多选项可能会给你带来平衡。

答案 4 :(得分:1)

顺便说一句,我和Vinay尝试了同样的事情,但是使用了JDK 1.5.0_17 jarsigner和一个正确的Verisign证书,并得到了相同的结果。 Jarsigner工作,并使用jarsigner验证jar -verify。

答案 5 :(得分:1)

添加它:我正在使用Java Web Start,我有一个只包含图像的jar。 使用JDK 1.6_05(也是07,10)和Ant生成,它的签名没有问题(使用自签名证书)。 因此,与其他描述的一样,它似乎没有链接到包含.class文件的jar。