使用认证密钥和所有权限对jar进行签名后,Applet ClassNotFoundException

时间:2014-01-07 20:13:05

标签: java applet java-7 classnotfoundexception

我有Java7更新45.我正在测试一个打包在jar文件中的小测试applet,我试图通过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控制台,我看到正在从Web应用程序URL加载SmallApplet类。

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清单和applet标记中的“沙盒”权限。

这种行为有解释吗?

2 个答案:

答案 0 :(得分:0)

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之外。通过添加代码库参数,它表示信任任何东西。您可以将其更改为特定的Web地址(例如http / https://)以更具体地将其锁定。

希望这会有所帮助。

答案 1 :(得分:0)

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

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

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

我在添加以下属性后终于开始工作了:

Trusted-Library: true