【问题标题】:How to sign Java Webstart application for Java 8u141?如何为 Java 8u141 签署 Java Webstart 应用程序?
【发布时间】:2017-07-19 13:07:18
【问题描述】:

Oracle 似乎做出了类似于 Java 7u45 的更改,需要设置新的清单值才能运行已签名的 Java Webstart 应用程序(请参阅here)。

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

您仍然可以使用 Java 8u141 运行您已签名的 Webstart 应用程序,即我有什么特殊问题吗?

release notes 中是对安全更改的说明,但它们看起来与代码签名无关。同样crypto roadmap 看起来这个版本并没有真正改变代码签名,尽管例如 Java 8u131,其中删除了 MD5 支持。但是 Java 8u131 对我有用,而且 Maven Java Webstart 插件也使用 SHA-256-Digest。

【问题讨论】:

  • 你能发布这个错误带来的堆栈跟踪吗?
  • @PallaviSonal 查看来自 Bogdan O stackoverflow.com/a/45195897/1184842 的答案,这是同样的错误。
  • 此错误已作为错误 JDK-8184993 的一部分得到解决,该修复将在计划于 7 月 26 日晚些时候发布的 JDK 8u144 的非周期版本中提供, 2017.
  • @Perneel 该问题已在更高版本的 JDK 8u161(处于早期访问阶段)中得到修复,并且该修复已向后移植到 JDK 8u144。 JRE 1.8.0_141-b15 已经公开发布,因此此版本中没有修复。新的更新版本 JDK 8u144 将在今天晚些时候发布在 Oracle 的下载页面上,您可以下载并验证。
  • @Perneel oracle.com/technetwork/java/javase/downloads/index.html ,此页面显示当前可用的发布版本。现在显示 Java SE 8u141 ,当它更新到 Java SE 8u144 时,你可以下载它。

标签: java code-signing java-web-start


【解决方案1】:

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

Name: org/apache/commons/httpclient

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

Name: org/apache/commons/httpclient/

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

【讨论】:

  • 我刚刚使用 Java 8u152 b05(抢先体验)进行了测试,它可以工作。
  • 我只删除了为我报告的依赖项,它也可以正常工作。我会验证是否有同样的问题。
  • 可以确认,适用于 8u152 b05 |相关问题:bugs.openjdk.java.net/browse/JDK-8184993
【解决方案2】:

我在 java 8u141 的 Java Webstart 应用程序中遇到了同样的问题。它也包含 commons-httpclient-3.1.jar。问题正是在这个 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 中。

【讨论】:

    【解决方案3】:

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

    一个名为usage 的新约束,当设置时,如果该算法用于指定用途的证书链中,则该算法会受到限制。最初支持三种用法:TLSServer 用于 TLS/SSL 服务器证书链,TLSClient 用于 TLS/SSL 客户端证书链,SignedJAR 用于签名 JAR 的证书链

    (强调我的)。另请注意,发行说明讨论了整个证书链。因此,即使您的签名证书使用更新/更强的哈希算法(SHA2 等),如果颁发机构的证书使用 SHA1,它仍然可能被拒绝。

    更多详情请访问:

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

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

    【讨论】:

    • 据我了解,这不会影响代码签名。但即使我错了,为什么这会影响 SHA-2 代码签名证书?
    • 如果链中有 SHA1 证书,那么为什么 jarsigner 用“jar 验证”验证 jar 是否有效?在第一次测试中,它甚至看起来真的只有这个罐子受到影响。我相信这是一个错误。
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 2014-09-23
        • 2010-11-22
        • 1970-01-01
        • 1970-01-01
        • 2018-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-18
        相关资源
        最近更新 更多