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



我有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清单和applet标记中使用"沙盒"权限。

这种行为有什么解释吗?

OP-我在一个带有签名的.jar中遇到了类似的问题。在过去的几个月里,java安全性已经成为一个主要的PITA,一切都需要完全正确。在我的案例中,我有很多.jar文件,有些有签名,有些没有。我为我的域创建了一个代码签名证书,然后写了一个.bat文件来剥离META-INF文件夹(其中包含清单文件和.class文件的签名),重新jar文件,然后对它们进行签名。除非我添加下面的行(使用jar umf change.txt,change.txt是我下面列出的五行)

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

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

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

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

希望这能有所帮助。

当我从一个代码签名证书切换到另一个来自不同CA的代码签名证书时,我遇到了类似的问题当加载Applet时,我得到了一个ClassNotFoundException

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

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

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

Trusted-Library: true

最新更新