从Java Webstart启动嵌入式Tomcat时的AccessControlException

时间:2012-03-22 21:47:46

标签: java security tomcat java-web-start

对于我们的Kunagi Java Web应用程序,我们有一个签名的kunagi.jar文件,其中包含我们的类以及嵌入式Tomcat 6中的类。这在调用java -jar kunagi.jar时运行良好。

但是当使用Java WebStart启动它时,我在嵌入式Tomcat启动时遇到异常:

java.security.AccessControlException: access denied (java.lang.RuntimePermission accessClassInPackage.org.apache.catalina.deploy)
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:393)
    at java.security.AccessController.checkPermission(AccessController.java:553)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
    at java.lang.SecurityManager.checkPackageAccess(SecurityManager.java:1529)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:291)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
    at net.sourceforge.jnlp.runtime.JNLPClassLoader.loadClass(JNLPClassLoader.java:1018)
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2444)
    at java.lang.Class.getMethod0(Class.java:2687)
    at java.lang.Class.getMethod(Class.java:1620)
    at org.apache.catalina.startup.SetPublicIdRule.begin(WebRuleSet.java:639)
    at org.apache.tomcat.util.digester.Digester.startElement(Digester.java:1276)
    ... 33 more

当然kunagi.jar已签名,否则甚至无法启动。它接缝Java WebStart全局启用Java安全性,它以某种方式嵌入Tomcat“继承”并且无法初始化。

这是JNLP文件:

<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+" codebase="http://kunagi.org/webstart" href="kunagi.jnlp">
    <information>
        <title>Kunagi</title>
        <vendor>Kunagi Team</vendor>
        <homepage href="http://kunagi.org"/>
        <description>SCRUM Tool</description>
        <description kind="short">SCRUM Tool</description>
        <offline-allowed/>
    </information>
    <security>
        <all-permissions/>
    </security>
    <resources>
        <j2se version="1.6+" href="http://java.sun.com/products/autodl/j2se"/>
        <jar href="kunagi.jar" main="true" />
    </resources>
    <application-desc name="Kunagi" main-class="katokorbo.Katokorbo"/>
    <update check="always"/>
</jnlp>

有没有办法在Java WebStart中禁用Tomcat的安全检查?或者我如何配置嵌入式Tomcat以允许访问org.apache.catalina...

8 个答案:

答案 0 :(得分:3)

Tomcat在各个地方实施安全管理器访问规则。关联的策略定义可在tomcat / conf / catalina.policy中找到。

如果a)安全管理器已打开,并且b)未应用所需的策略文件,则Tomcat中不存在错误。

当然,Tomcat包含各种包中的代码,当然,使用这些包中的类是正常的。

更新:我在沙箱中运行JNLP应用程序时没有问题。 Tomcat成功启动,但有一些与您描述的异常无关的异常。我会尝试删除任何以前下载的文件&amp;尝试清除缓存中的所有证书。

我还建议升级到最新版本的Tomcat 6.0。

答案 1 :(得分:3)

@Witek:Tomcat不会打开SecurityManager:必须在启用SecurityManager并启用策略文件的情况下启动JVM。在安全管理器到位后很久就会启动Tomcat。

答案 2 :(得分:2)

解决方案是对要求获得需要信任的许可的罐子进行数字签名。任何未签名且不需要信任的东西都需要移动到扩展JNLP。

答案 3 :(得分:2)

Tomcat似乎已使用其权限来修改全局状态(此处为package.access安全属性)。签名的jar可以在不受信任的代码共享的进程中运行。你真的不想把两者混合在一起。因此,看起来Tomcat在这里使用它并不适合WebStart。

(Oracle JRE确实有一个安全检查跟踪功能 - -Djava.security.debug=all,IIRC)。

答案 4 :(得分:2)

  

java.security.AccessControlException:拒绝访问(java.lang.RuntimePermission accessClassInPackage.org.apache.catalina.deploy)

每当得到AccessControlException时,括号中的部分就是您需要在.policy文件中授予的权限,或者在部署描述符中使用JWS时的权限。

答案 5 :(得分:1)

公平地说,这似乎是Tomcat中的一个错误,你应该报告它。它不应该尝试在另一个包中获取类的方法,因为在安全管理器下它总是会失败。

然而,在修复错误之前,你不能避免让“WebRuleSet”的东西被调用吗?我不知道它究竟是什么,但它似乎是因为你的Tomcat配置而被调用的东西。这不是你可以从配置中删除的东西吗?

答案 6 :(得分:0)

您可以修改政策文件。例如,当您部署admin war时,您将遇到安全问题,您必须编辑位于tomcat conf目录中的catalina.policy,以便像下面那样输入低值来解决此问题。

grant codeBase "file:${catalina.base}/webapps/admin/-" {
                permission java.security.AllPermission;
};

答案 7 :(得分:-2)

我已经解决了我的问题如下:

WebStart启动我的应用程序后禁用安全管理器。我的main()方法中的第一行:

System.setSecurityManager(null);

告诉Tomcat使用默认的类加载器:

context.setLoader(new WebappLoader(getClass().getClassLoader()));

现在Tomcat在WebStart中运行:-D