【问题标题】:Java Web Start Jar signing Issue?Java Web Start Jar 签名问题?
【发布时间】:2012-07-26 16:21:30
【问题描述】:

我正在尝试通过 Java Web Start 运行这个 Java 应用程序 (jar),并且遇到了非常困难的时期。

这是我当前的 JNLP 来源:

<?xml version="1.0" encoding="utf-8"?> 
<jnlp spec="1.0+" codebase="http://localhost:8080/" href="Test.jnlp">
    <information>
        <title>Jnlp Testing</title>
        <vendor>YONG MOOK KIM</vendor>
        <homepage href="http://localhost:8080/" />
        <description>Testing Testing</description>
    </information>
    <security>
        <all-permissions/>
    </security>
    <resources>
        <j2se version="1.6+" />
        <jar href="TestJnlp.jar" />
        <jar href="lib/appframework-1.0.3.jar"/>
        <jar href="lib/junit-4.7.jar"/>
        <jar href="lib/org.eclipse.swt.win32.win32.x86_64_3.100.0.v4233d.jar"/>
        <jar href="lib/org-netbeans-modules-java-j2seproject-copylibstask.jar"/>
        <jar href="lib/sqlite-jdbc-3.7.2.jar"/>
        <jar href="lib/swing-worker-1.1.jar"/>
    </resources>
    <application-desc main-class="proteotypic.ProteotypicQuantificationApp" />
</jnlp>

运行 JNLP 文件时,出现以下错误:

JNLPException[category: Launch File Error : Exception: null : LaunchDesc:

---- here the JNLP ----

at com.sun.javaws.security.JNLPSignedResourcesHelper.checkSignedResourcesHelper(Unknown Source)
at com.sun.javaws.security.JNLPSignedResourcesHelper.checkSignedResources(Unknown Source)
at com.sun.javaws.Launcher.prepareResources(Unknown Source)
at com.sun.javaws.Launcher.prepareAllResources(Unknown Source)
at com.sun.javaws.Launcher.prepareToLaunch(Unknown Source)
at com.sun.javaws.Launcher.prepareToLaunch(Unknown Source)
at com.sun.javaws.Launcher.launch(Unknown Source)
at com.sun.javaws.Main.launchApp(Unknown Source)
at com.sun.javaws.Main.continueInSecureThread(Unknown Source)
at com.sun.javaws.Main$1.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

我已经签署了除lib/org.eclipse.swt.win32.win32.x86_64_3.100.0.v4233d.jar 之外的所有 jar - 如果我也签署了那个,我会得到一个不同的例外:

com.sun.deploy.net.FailedDownloadException: Unable to load resource: http://localhost:8080/lib/org.eclipse.swt.win32.win32.x86_64_3.100.0.v4233d.jar
at com.sun.deploy.net.DownloadEngine.actionDownload(Unknown Source)
at com.sun.deploy.net.DownloadEngine.getCacheEntry(Unknown Source)
at com.sun.deploy.net.DownloadEngine.getCacheEntry(Unknown Source)
at com.sun.deploy.net.DownloadEngine.getResourceCacheEntry(Unknown Source)
at com.sun.deploy.net.DownloadEngine.getResourceCacheEntry(Unknown Source)
at com.sun.deploy.net.DownloadEngine.getResource(Unknown Source)
at com.sun.javaws.LaunchDownload$DownloadTask.call(Unknown Source)
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

java.io.IOException: invalid SHA1 signature file digest for org/eclipse/swt/awt/SWT_AWT$4.class
at com.sun.deploy.cache.CacheEntry$9.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.deploy.cache.CacheEntry.writeFileToDisk(Unknown Source)
at com.sun.deploy.cache.Cache.downloadResourceToTempFile(Unknown Source)
at com.sun.deploy.cache.Cache.downloadResourceToCache(Unknown Source)
at com.sun.deploy.net.DownloadEngine.actionDownload(Unknown Source)
at com.sun.deploy.net.DownloadEngine.getCacheEntry(Unknown Source)
at com.sun.deploy.net.DownloadEngine.getCacheEntry(Unknown Source)
at com.sun.deploy.net.DownloadEngine.getResourceCacheEntry(Unknown Source)
at com.sun.deploy.net.DownloadEngine.getResourceCacheEntry(Unknown Source)
at com.sun.deploy.net.DownloadEngine.getResource(Unknown Source)
at com.sun.javaws.LaunchDownload$DownloadTask.call(Unknown Source)
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

在执行“javaws -viewer”并重新运行 JNLP 后,我得到:

https://gist.github.com/3183636

【问题讨论】:

  • 尝试使用javaws -viewer 清除您之前尝试的任何痕迹。
  • 谢谢。我在上面发布了结果。
  • 这似乎是第一个例外,正如递归所说,您必须使用相同的签名签署所有罐子。你在最后一次尝试之前都签名了吗?
  • 尝试从所有 jar 中剥离所有签名,然后用新证书签名一次。
  • Andrew Thompson 和 pmoleri - 非常感谢。我完全按照你说的做了,而且效果很好。首先,我剥离了所有签名,然后使用我自己的签名重新分配!我怎么能代表你们?你需要“回答”这个问题吗?

标签: java jnlp java-web-start


【解决方案1】:

您必须签署 jar 文件。您可以使用keytool 自己执行此操作,但如果您计划部署此功能,我建议您由Verisign 或类似公司签名。

如果您只需要临时修复,signing it yourself 进行测试就可以了。

这是一个易于使用的tutorial。

【讨论】:

  • 感谢您的快速回复。但是,我已经签署了我的 jar 文件。我还检查并签署了除 lib/org.eclipse.swt.win32.win32.x86_64_3.100.0.v4233d.jar 之外的所有引用库。有什么想法吗?
  • 嗯,我不确定。也许将其添加到您的问题中,其他人将能够提供帮助!对不起!
  • @user1509227 您是否也尝试过签署该库以查看它是否有所作为?
  • 在签署该库之后,我也得到以下异常:gist.github.com/3183209 和以下“包装异常”:gist.github.com/3183216
【解决方案2】:

所有 jar 必须使用相同的签名。

【讨论】:

    【解决方案3】:

    一个 jnlp 中的所有 jars 需要使用相同的签名进行签名,对于由第三方签名的 jars,请使用具有自己 jnlp 的扩展。

    有些 jar 使用 jar 中的原始签名进行加密(SQL 服务器的 JDBC 驱动程序),其他的在重新签名时不起作用(javahelp.jar)

    您还可以通过将其包含在应用程序的 jnlp 中来省去签署它们的麻烦:

    <extension name="javahelp" href="javahelp.jnlp"/>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-06
      • 1970-01-01
      • 1970-01-01
      • 2013-08-09
      • 1970-01-01
      相关资源
      最近更新 更多