4

我们的产品在 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 及更高版本的 jarsign 的更改?我在发行说明中找不到它。

4

6 回答 6

9

我无法验证是否有任何问题。你能仔细看看你的环境有什么不同吗?我在 Windows 7 RC 上运行。

让我们检查一下版本:

C:\temp>java -版本
java版本“1.5.0_14”
Java(TM) 2 运行时环境,标准版(内部版本 1.5.0_14-b03)
Java HotSpot(TM) Client VM(build 1.5.0_14-b03,混合模式,共享)

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

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/*
添加清单
添加:com/rdc/(in = 0) (out= 0)(存储 0%)
添加:com/rdc/test/(in = 0) (out= 0)(已存储 0%)
添加:com/rdc/test/logging.properties(in = 13) (out= 15)(deflate -15%)

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

C:\temp>jarsigner -signedjar test-dest.jar test-source.jar vinay
输入密钥库的密码:

警告:签名者证书将在六个月内到期。

让我们看看我们签名的 jar 中有什么:

C:\temp>jar tvf test-dest.jar
   2009 年 7 月 15 日星期三 23:39:12 BST 155 META-INF/MANIFEST.MF
   276 7 月 15 日星期三 23:39:12 BST 2009 META-INF/VINAY.SF
  1130 年 7 月 15 日星期三 23:39:12 BST 2009 META-INF/VINAY.DSA
     2009 年 7 月 15 日星期三 23:37:18 BST 2009 META-INF/
     2009 年 7 月 15 日星期三 19:44:44 BST com/rdc/
     2009 年 7 月 15 日星期三 19:44:58 BST com/rdc/test/
    2009 年 7 月 15 日星期三 23:37:10 BST com/rdc/test/logging.properties

好的,它似乎已经签名,并且它没有类。我们看一下内容MANIFEST.MF

清单版本:1.0
创建者:1.5.0_14(Sun Microsystems Inc.)

名称:com/rdc/test/logging.properties
SHA1-摘要:Ob/S+a7TLh+akYGEFIDugM12S88=

和内容VINAY.SF

签名版:1.0
创建者:1.5.0_14(Sun Microsystems Inc.)
SHA1-摘要-清单-主要属性:4bEkze9MHmgfBoY+fnoS1V9bRPs=
SHA1-摘要-清单:YB8QKIAQPjEYh8PkuGA5G8pW3tw=

名称:com/rdc/test/logging.properties
SHA1-摘要:qXCyrUvUALII7SBNEq4R7G8lVQQ=

现在,让我们验证 jar:

C:\temp>jarsigner -verify -verbose test-dest.jar

         2009 年 7 月 15 日星期三 23:51:34 BST 155 META-INF/MANIFEST.MF
         276 7 月 15 日星期三 23:51:34 BST 2009 META-INF/VINAY.SF
        1131 年 7 月 15 日星期三 23:51:34 BST 2009 META-INF/VINAY.DSA
           2009 年 7 月 15 日星期三 23:37:18 BST 2009 META-INF/
           2009 年 7 月 15 日星期三 19:44:44 BST com/rdc/
           2009 年 7 月 15 日星期三 19:44:58 BST com/rdc/test/
smk 13 7 月 15 日星期三 23:37:10 BST 2009 com/rdc/test/logging.properties

  s = 签名已验证
  m = 条目在清单中列出
  k = 在密钥库中至少找到一个证书
  i = 在身份范围内找到至少一个证书

jar 验证。

警告:此 jar 包含签名证书将在
六个月。使用 -verbose 和 -certs 选项重新运行以获取更多详细信息。

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

于 2009-07-15T22:57:02.157 回答
2

For anyone searching on this issue, we determined it only affects certain later versions of Java 1.5, those from 1.5.0_14 onward, I believe. It appears to be fixed in the latest versions of 1.5, and is definitely fixed in 1.6.

于 2009-09-03T14:37:54.183 回答
1

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

于 2009-06-10T16:45:42.193 回答
1

这是一个漫长的过程,但 Ant SignJar 任务可能能够说服 jarsign 做正确的事情。那里有很多选项可能会打破平衡。

于 2009-07-14T20:14:42.517 回答
1

BTW, I tried the same thing as Vinay, but with the JDK 1.5.0_17 jarsigner, and a proper Verisign certificate, and got the same results. Jarsigner worked, and the jar verified using jarsigner -verify.

于 2009-07-17T21:16:59.990 回答
1

Adding about it : I'm using Java Web Start, and I have a jar which contains only images. With a JDK 1.6_05(07, 10, too), and an Ant generation, it is signed without a problem (with a self-signed cert). So, like others described, it doesn't seem to be linked to the jar containing .class files or not.

于 2009-07-20T13:53:01.720 回答