对于我们的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...
?
答案 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