如何为 Java 8u141 签署 Java Webstart 应用程序?

How to sign Java Webstart application for Java 8u141?

看起来 Oracle 进行了类似于 Java 7u45 的更改,其中新的清单值需要设置为 运行 签名 Java Webstart 应用程序(请参阅 here).

目前我们使用 Java 8u131 签名的应用程序不以 Java8u141 开头,错误消息为 Could not verify signing in resource: (arbitrary resource.jar)

你还能 运行 使用 Java 8u141 签名的 Webstart 应用程序吗?也就是说,我有什么特殊问题吗?

release notes is a note to security changes, but they don't look related to code signing. Also crypto roadmap 中看起来这个版本并没有真正改变代码签名,尽管 Java 8u131 例如,其中删除了 MD5 支持。但是 Java 8u131 对我有用,Maven Java Webstart 插件也使用 SHA-256-Digest。

有一个影响代码签名的变化:SHA-1 证书被禁用。您链接到的发行说明中提到了这一点。他们特别提到:

A new constraint named usage, that when set, restricts the algorithm if it is used in a certificate chain for the specified use(s). Three usages are initially supported: TLSServer for TLS/SSL server certificate chains, TLSClient for TLS/SSL client certificate chains, and SignedJAR for certificate chains used with signed JARs.

(强调我的)。另请注意,发行说明讨论了 整个证书链 。因此,即使 您的 签名证书使用 newer/stronger 哈希算法(SHA2 等),如果 颁发机构的 证书使用 SHA1。

更多详细信息:

https://bugs.openjdk.java.net/browse/JDK-8176536

http://openjdk.java.net/jeps/288

我找到了解决方案或更确切地说是解决问题的方法。有问题的罐子在我们的例子中是 commons-httpclient-3.1.jar。清单包含以下条目

Name: org/apache/commons/httpclient

我在末尾添加了一个 / 然后我签署并重新部署了应用程序。

Name: org/apache/commons/httpclient/

这次 web 启动应用程序启动没有任何问题。在这两种情况下,jar 都是用 java 8u141 签名的,jarsigner 可以验证 jar,但 webstart 在第一种情况下没有启动。在我看来,这是一个 webstart 错误。

我在 Java java 8u141 的 Webstart 应用程序中遇到了同样的问题。它也包含 commons-httpclient-3.1.jar。问题就在这个罐子里。

看来验证算法已更改。现在所有清单条目都应该有摘要。我发现这个原始 jar 已经包含一个清单条目 org/apache/commons/httpclient 而没有 digest:

Name: org/apache/commons/httpclient
Implementation-Title: org.apache.commons.httpclient
Implementation-Version: 3.1
X-Compile-Target-JDK: 1.2
Specification-Vendor: Apache Software Foundation
Specification-Title: Jakarta Commons HttpClient
Implementation-Vendor-Id: org.apache
Extension-name: org.apache.commons.httpclient
X-Compile-Source-JDK: 1.2
Specification-Version: 3.1
Implementation-Vendor: Apache Software Foundation

我通过更改 ant jar 任务设置解决了问题。我添加到 排除 'zipfileset' 的 .MF 文件(也可能是 .SF、.RSA、.DSA 文件)。也可能需要更改属性 'filesetmanifest' = merge.

它防止清单条目出现在最终签名的 jar 中。

我遇到了同样的问题。我的解决方案是通过修改构建脚本 (ant:jar filesOnly="true") 或使用小 groovy 脚本重新打包 jar 来删除 jar 中的所有目录条目(因为它们通常是无用的)目录条目。

这绝对是一个 JWS 错误 - 我想知道 Oracle 是如何没有注意到这个错误的,以及他们是否会为此提供快速修复...

我遇到了 commons-httpclient-3.1.jar、axis-1.4.jar、xml-resolver-1.2.jar、oro-2.0 的问题.8.jar。打开 MANIFEST.MF 在名称末尾添加“/”。重新构建并签署项目,现在它可以工作了