1

我有一个 JWS (Java Web Start) 部署的小程序,它使用以下库/jar:

red5.jar spring-beans.jar spring-context.jar spring-core.jar apache-mina.jar

bcprov-ext-jdk16-145(充气城堡)

我将所有这些库放在小程序中的原因是 red5.jar 要求您还拥有其他库。然而,BouncyCastle 不知何故不会被 ClassLoader 加载,也不会在 WebStart 项目的编译过程中被 Netbeans 签名。任何指针我该如何解决?

如果我将 Bouncy Castle 包含在我的档案中,我会得到以下结果:

basic: exception: JAR resources in JNLP file are not signed by same certificate.
exception: JAR resources in JNLP file are not signed by same certificate.
JNLPException[category: Launch File Error : Exception: null : LaunchDesc

这是我什至不将其包含在项目中时得到的结果:

com.sun.deploy.net.FailedDownloadException: Unable to load resource: file:/C:/JNA/dist/lib/bcprov-ext-jdk16-145.jar

我不知道哪个罐子需要 Bouncy Castle 罐子,因为它在我的 IDE 中没有指出。此外,即使我在我的项目中包含 Bouncy Castle.jar,Netbeans 也应该默认对其进行签名,但它不会,尽管它会在我的 Web Start 项目中对所有其他 jar 进行签名。然而,使用 jarsigner 快速检查表明所有 jars,包括 Bouncy Castle,都已签名,所以我安全地假设它们都已签名,但 Bouncy Castle 是用另一个证书签名的除外。

这是我的问题:我应该尝试手动签署所有文件(因此它们都具有相同的证书)还是其他地方的问题(例如 BouncyCastle 无法在小程序中签名,或其他什么)?

任何指针将不胜感激

编辑:

我基本上有两种方法,到目前为止都失败了:

方法1.提取每个jar的目录树并将它们一起转储到一个共享目录中,然后将该目录制作一个jar,因此其中的所有文件都由相同的证书签名(一个jar,一个证书,对..)但是, spring STILL 期望文件像这样组织:dist\libs\bcProv.jar,而不是 dist\libs\allLibs.jar,其中所有库都转储到 allLibs.jar。该方法惨遭失败,因为当通过 JWS 部署时,spring 找不到任何库。

方法 2. 使用相同的证书手动签署所有 jar。在花费 10 分钟手动对 jar 进行签名后,这种方法也失败了,并且大胆地抛出一个错误,即 bcProv.jar 没有使用与其他证书相同的证书进行签名。

我感到困惑、困惑和困惑。有任何想法吗?是否有可能在 JWS 小程序中将这些罐子放在一起:

red5.jar

spring-beans.jar

spring-context.jar

spring-core.jar

apache-mina.jar

bcprov-ext-jdk16-145

4

3 回答 3

4

好的,所以这是答案:

首先,正如 Bloodboiler 所建议的,如果您的小程序使用由不同证书签名的 jar,您将遇到麻烦。因此,您的解决方案应该是使用相同的证书对它们进行签名。

您确实有一些可能性:

一种是提取所有项目的 jar,然后将它们合并到一个 jar 中并签名。由于某种原因,这不适用于 Spring-context 和 BouncyCastle。我敢肯定,如果我有勇气摆弄它,它会奏效的。

另一种方法是,就像 M.Joanis 建议的那样,使用 FatJar,但由于某种原因它也不起作用。至于上面描述的方法,我并没有在上面花费太多时间的愿望或倾向。

第三种方法,即有效的方法,就是验证你的 dist 目录证书中的 jars。如果它们不同,那么正如 Bloodboiler 所建议的那样,你就有麻烦了。解决方案是取消对 jars 的签名(提取、删除 META-INF ),然后使用 SAME 证书对它们全部签名(使 jar 成为您的首选方式,然后以您的首选方式对其进行签名,并确保您使用的所有 jar 都由您签名(使用 jarsigner -verify -cert 等...))。那么这整个混乱应该起作用。

于 2010-11-26T08:06:22.817 回答
2

我遇到了完全相同的问题,只是使用了不同的罐子。如果我没记错的话,webstart 中有一个错误会导致它失败,除非所有 jar 都使用相同的证书/仅使用一个证书进行签名。

一种解决方案是提取库 jar 并将其内容包含在您的应用程序 jar 中,然后仅签署该 jar。

于 2010-11-25T09:16:36.970 回答
1

也遇到了同样的问题...

如果您曾经将 Eclipse 用作 IDE,请考虑使用FatJar ... 真正简化了打包过程。我发布了 JWS JAR,其中包含超过 40 个 JAR 依赖项。我对它们进行 FatJar,然后对生成的 JAR 进行签名。奇迹般有效。

于 2010-11-26T06:30:31.933 回答