【问题标题】:How do I force jarsign to sign jarfiles?如何强制 jarsigner 签署 jar 文件?
【发布时间】:2010-11-01 21:14:58
【问题描述】:

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

我能做些什么来强制 jarsign 签署这些罐子?或者我可以做些什么来通过 Java Web Start 分发这些 jar 而无需对其进行签名?是否有任何地方记录了对 1.5.0_14 及更高版本的 jarsign 的更改?我在release notes 中找不到。

【问题讨论】:

  • 你能展示你用来创建签名 jar 文件的命令吗?

标签: java jar jarsigner


【解决方案1】:

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

【讨论】:

  • 是的,我们找到了 Hello World java 应用的用途 :)
【解决方案2】:

这是一个长远的目标,但 Ant SignJar task 或许能够说服 jarsign 做正确的事。那里有很多选项可能会打破平衡。

【讨论】:

    【解决方案3】:

    我无法验证是否存在任何问题。你能仔细看看你的环境有什么不同吗?我在 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 选项重新运行以获取更多详细信息。

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          对于搜索此问题的任何人,我们确定它仅影响 Java 1.5 的某些更高版本,我相信是从 1.5.0_14 开始的版本。它似乎在 1.5 的最新版本中已修复,并且在 1.6 中肯定已修复。

          【讨论】:

            猜你喜欢
            • 2012-06-10
            • 1970-01-01
            • 2013-03-16
            • 2013-09-05
            • 2014-02-22
            • 2016-02-18
            • 2013-10-07
            • 2013-06-15
            相关资源
            最近更新 更多