签名Java小程序在连接到Web服务时引发安全异常

签名Java小程序在连接到Web服务时引发安全异常,java,applet,signed,self-signed,securityexception,Java,Applet,Signed,Self Signed,Securityexception,我有一个java小程序在Tomcat5.5上运行。它已签名(-selfcert)。当我的小程序尝试连接到Web服务(已在此行中)时,我仍然会遇到java.security.AccessControlException:access denied(java.lang.RuntimePermission createClassLoader)异常: 因为这里有一些类似的问题,我读到: 是,小程序已签名。我用-verify检查了一下 Tomcat安全例外,可能是,但我已添加到catalina.poli

我有一个java小程序在Tomcat5.5上运行。它已签名(-selfcert)。当我的小程序尝试连接到Web服务(已在此行中)时,我仍然会遇到
java.security.AccessControlException:access denied(java.lang.RuntimePermission createClassLoader)
异常:

因为这里有一些类似的问题,我读到:

  • 是,小程序已签名。我用-verify检查了一下

  • Tomcat安全例外,可能是,但我已添加到catalina.policy:

    grant codeBase "file:/home/me/apache-tomcat-5.5.27/webapps/myapplet/-" {
        permission java.security.AllPermission;    };
    
    grant codeBase”文件:/home/me/apache-tomcat-5.5.27/webapps/myapplet/applet.jar“{permission java.security.AllPermission;}

还有一些常见的东西,比如:

grant codeBase "file:${java.home}/jre/lib/ext/-" {
        permission java.security.AllPermission;
};
没有结果

好,快速更新,添加:

grant{
        permission java.security.AllPermission;
};

到本地java.policy文件修复了该问题。但这不是我想要的,小程序应该在avarage机器上运行,带有dafault java.policy文件。因此必须从代码中修复它。

您是从applet主线程调用WS,还是从使用javascript调用applet方法启动的线程调用WS

见下面的例子

希望能有帮助

public class MyApplet extends JApplet {

    @Override
    public void start() {
        // It will work if your applet is signed
        callWebService();
    }

    public void methodCalledFromJavascriptWrong() {
        // It will NOT work even if your applet is signed
        callWebService();

    }

    public void methodCalledFromJavascriptGood() {
        AccessController.doPrivileged(new PrivilegedAction() {

            public Object run() {
                // It will work if your applet is signed
                callWebService();
                return null;
            }

        });

    }

    private void callWebService() {
        //Here you call your web service
    }
}

您是从applet主线程调用WS,还是从使用javascript调用applet方法启动的线程调用WS

见下面的例子

希望能有帮助

public class MyApplet extends JApplet {

    @Override
    public void start() {
        // It will work if your applet is signed
        callWebService();
    }

    public void methodCalledFromJavascriptWrong() {
        // It will NOT work even if your applet is signed
        callWebService();

    }

    public void methodCalledFromJavascriptGood() {
        AccessController.doPrivileged(new PrivilegedAction() {

            public Object run() {
                // It will work if your applet is signed
                callWebService();
                return null;
            }

        });

    }

    private void callWebService() {
        //Here you call your web service
    }
}

如果您正在使用小程序中的其他库(JAR),这些库与任何受限制的资源相互作用,它们也应该被签名。
因此,请给出整个stacktrace和My_WebserviceLocator。(并且不要使用下划线)。例如,尝试对axis.jar进行签名。

如果您正在使用小程序中与任何受限资源交互的其他库(jar),那么也应该对它们进行签名。
因此,请给出整个stacktrace和My_WebserviceLocator。(并且不要使用下划线)。例如,尝试对axis.jar进行签名。

作为临时解决方案,您可以禁用SecurityManager。当然,这会有一些安全问题,但至少您可以跟踪到SecurityManager(即权限问题)


如果这确实有效,我猜您配置了错误的策略文件。从浏览器运行小程序时,我几乎可以肯定小程序启动器将是一个普通的消费者JRE,而不是与JDK捆绑在一起的JRE。

作为一种临时解决办法,您可以禁用SecurityManager。当然,这会有一些安全问题,但至少您可以跟踪到SecurityManager(即权限问题)


如果这确实有效,我猜您配置了错误的策略文件。从浏览器运行小程序时,我几乎可以肯定小程序启动器将是一个普通的消费者JRE,而不是与JDK捆绑在一起的JRE。

在服务器上设置权限不是解决方案。浏览器中的安全管理员会抱怨

建议使用AccessManager是indead强制的,否则将失败。 但在从start()或init()调用webservice时,也需要执行相同的操作

我可以问一下:Web服务调用是您拥有小程序的唯一原因吗?最好放置一个代理servlet,以避免相同的域策略限制。然后您可以在浏览器中使用纯HTML+Javascript


如果在小程序完全启动之前从JS调用小程序,则可能会失败,因此应等待小程序准备就绪。

在服务器上设置权限不是解决方案。浏览器中的安全管理员会抱怨

建议使用AccessManager是indead强制的,否则将失败。 但在从start()或init()调用webservice时,也需要执行相同的操作

我可以问一下:Web服务调用是您拥有小程序的唯一原因吗?最好放置一个代理servlet,以避免相同的域策略限制。然后您可以在浏览器中使用纯HTML+Javascript


如果在小程序完全启动之前调用JS中的小程序,则可能会失败,因此您应该等待小程序准备就绪。

不是这样,否则小程序不会启动,小程序会启动,并且除了创建ws_定位器和粗略连接到webserviceLaurent K之外,所有功能都可以工作,你能解释一下为什么会这样吗?有没有什么解决办法,这样我就不用一直玩特权动作了?具体在哪里解释?我有一个调用javax.smartcardio的小程序,大部分时间是通过Javascript调用的。我见过一些技巧,比如为智能卡访问创建一个特权线程,但这对我来说太过工程化了。谢谢,这是我的问题,当从javascript调用时,事情不起作用。不,不是这样,否则小程序不会启动,小程序确实启动了,除了创建ws_定位器和粗略连接到webserviceLaurent K之外,所有功能都正常工作,您能解释一下为什么会这样吗?有没有什么解决办法,这样我就不用一直玩特权动作了?具体在哪里解释?我有一个调用javax.smartcardio的小程序,大部分时间是通过Javascript调用的。我见过一些技巧,比如为智能卡访问创建一个特权线程,但这对我来说太过工程化了。谢谢,这是我的问题,当从javascript调用时,事情不起作用。给整个stacktrace+my_WebServiceLocator好吧,你还没有给整个stacktrace.Wth。安斯威尔当选。那太糟糕了。给整个stacktrace+My_WebServiceLocator好吧,你还没有给整个stacktrace.Wth。安斯威尔当选。这太糟糕了。正如我在另一个answear的评论中所写的那样,小程序确实启动了,它完成了所有应该做的事情,除非我在某个地方,任何你在问题中看到的代码行中写下。axis2 Web服务存根
System.setSecurityManager(null);