签名的 Java Applet 在连接到 Web 服务时引发安全异常
-
21-09-2019 - |
题
我有一个在 tomcat 5.5 上运行的 java 小程序。它已签名(-selfcert)。我仍然得到一个 java.security.AccessControlException: access denied (java.lang.RuntimePermission createClassLoader)
例外,当我的 Applet 尝试连接到 Web 服务时(已经在这一行中):
ws_locator = new My_WebserviceLocator(ws_adress + "?wsdl",
new javax.xml.namespace.QName("http://impl.webservice", "My_Webservice"));
由于这里有一些类似的问题,我阅读了它们:
是的,小程序已签名。我用-verify检查过。
Tomcat 安全异常,可能是,但我已添加到 catalina.policy:
grant codeBase "file:/home/me/apache-tomcat-5.5.27/webapps/myapplet/-" { permission java.security.AllPermission; };
grant codeBase "file:/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 文件修复了该问题。但这不是我想要的,小程序应该在普通机器上运行,并带有默认的 java.policy 文件。因此必须从代码中修复它。
解决方案
您是从 applet 主线程还是从使用 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
}
}
其他提示
在服务器上设置权限并不是解决方案。抱怨的是浏览器中的安全管理器。
建议使用 AccessManager 确实是强制性的,否则将会失败。但是,当从 start() 或 init() 调用 Web 服务时,您也需要执行相同的操作。
请问:WebService 调用是您拥有小程序的唯一原因吗?最好放置一个代理 servlet 以避免相同域策略限制。然后就可以在浏览器中使用纯HTML + Javascript了。
如果在小程序完全启动之前从 JS 调用小程序可能会失败,因此您应该等待小程序准备就绪。
如果您正在使用小程序中的其他库(jar),它们会与任何受限资源发生交互,那么它们也应该被签名。因此,请提供整个堆栈跟踪和 My_WebserviceLocator。(并且不要使用下划线)。例如,尝试签署 axis.jar。
作为一个 临时解决方法, ,您可以禁用SecurityManager。当然,这会带来一些安全问题,但至少您可以将其追踪到 SecurityManager(即权限问题)。
System.setSecurityManager(null);
如果这确实有效,我的猜测是您配置了错误的策略文件。从浏览器运行小程序时,我 几乎 确保小程序启动器是常规消费者 JRE,而不是与 JDK 捆绑在一起的 jre。