【问题标题】:Applet ClassNotFoundException after signing jar with certified key and all-permissions使用经过认证的密钥和所有权限对 jar 签名后的 Applet ClassNotFoundException
【发布时间】:2014-01-25 16:27:12
【问题描述】:

我有 Java7 更新 45。我正在测试一个打包在 jar 文件中的小型测试小程序,我试图通过 HTML 页面加载该文件:

<html>
 <body>
  <applet code="SmallApplet" archive="appTable89Signed.jar" codebase="." width=500 height=500>
    <param name="permissions" value="all-permissions" />
  </applet>
 </body>
</html>

jar 文件清单具有 Permission 属性,其值为“all-permissions”。当我使用经过认证的密钥签署 jar 文件时,我得到了ClassNotFoundException。查看 tomcat 访问日志以及从 Java 控制台输出的信息,我看到 SmallApplet 类正在从 Web 应用程序 URL 加载。

network: Connecting http://xxxxxx:8085/testappletsigning/SmallApplet.class with proxy=DIRECT

后面跟着异常

java.lang.ClassNotFoundException: SmallApplet
    at sun.plugin2.applet.Applet2ClassLoader.findClass(Unknown Source)
    at sun.plugin2.applet.Plugin2ClassLoader.loadClass0(Unknown Source)
    at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source)
    at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.plugin2.applet.Plugin2ClassLoader.loadCode(Unknown Source)
    at sun.plugin2.applet.Plugin2Manager.initAppletAdapter(Unknown Source)
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
basic: load: class SmallApplet not found

如果我使用自签名并将其作为可信证书导入,那么异常就会消失。

我可以使用认证密钥签署 jar 的唯一方法似乎是在 jar 清单和小程序标记中使用“沙盒”权限。

对这种行为有解释吗?

【问题讨论】:

  • “如果我使用自签名并将其作为受信任的证书导入,那么异常就会消失。” 这很奇怪,我也期待同样的行为大大地。请检查bug database,如果找不到类似的东西,请提出新的报告..

标签: java applet java-7 classnotfoundexception


【解决方案1】:

OP- 我对一个带有签名的 .jar 文件也有类似的问题。在过去的几个月里,java 安全已经成为一个主要的 PITA,一切都需要完全正确。就我而言,我有许多 .jar 文件,其中一些有签名,而另一些则没有。我为我的域创建了一个代码签名证书,然后编写了一个 .bat 文件来删除 META-INF 文件夹(其中包含清单文件和 .class 文件的签名),重新压缩文件然后对其进行签名。除非我添加以下行(使用 jar umf change.txt,change.txt 是我在下面列出的五行),否则我的将无法工作

第一件事(您可能已经测试过,但我还是会这么说)是您需要信任证书。

但我认为您的问题是您需要在清单文件中添加额外的行(在您签名之前!)。我将这些行添加到我的清单中,使用 jarsigner 对其进行签名,然后它运行良好。

Codebase: *
Permissions: all-permissions
Application-Library-Allowable-Codebase: *
Caller-Allowable-Codebase: *
Application-Name: <my app name>

我不是 Java 程序员,所以我不能完全 100% 确定为什么需要每个。但据我所知,Java 安全知道您从哪里调用 .jar 文件,并且如果在外部有一个类,它不会调用它,因为它存在于 .jar 之外。通过添加代码库参数,它表示信任任何东西。您可以将其更改为特定的网址(例如 http/https://)以更具体地锁定它。

希望这会有所帮助。

【讨论】:

  • 不幸的是,这并不能解决问题。行为保持不变。
  • 哇.... 太糟糕了。如果您将 Java 版本降级到 7u11 之类的早期版本,我认为这可以正常工作? 7u45 中的安全更新使其难以启动。
【解决方案2】:

从一个代码签名证书切换到另一个 CA 的另一个代码签名证书时,我遇到了类似的问题。我用新证书签署了完全相同的 jar,并且 加载小程序时,我得到了一个ClassNotFoundException

清单包含以下与安全相关的属性:

Application-Name: <app name>
Permissions: all-permissions
Codebase: *

添加以下属性后,我终于让它工作了:

Trusted-Library: true

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-21
    • 2011-12-13
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    • 2014-01-18
    • 2014-09-20
    相关资源
    最近更新 更多