我有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标记中的“沙盒”权限。
这种行为有解释吗?
答案 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