[英]calling signed applet function from javascript with java.security.AccessControlException: access denied
[英]“java.security.AccessControlException: access denied” executing a signed Java Applet
我有一个小Java小程序,我有一个恼人的问题。 我使用jarsigner工具(遵循这些说明 )使用我自己的密钥库签署了我的JAR。
Java Applet下载已签名的 JAR并尝试使用扩展类URLClassLoader启动它。 这个JAR试图执行这行代码:
ClassLoader.getSystemClassLoader().getResource("aResource");
它失败了,堆栈跟踪很大,完成了:
Caused by: java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "getClassLoader")
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:366)
at java.security.AccessController.checkPermission(AccessController.java:555)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
at java.lang.ClassLoader.getSystemClassLoader(ClassLoader.java:1476)
at test.SecondJAR.main(SecondJAR.java:8)
(test.SecondJAR的第8行对应于getResource(...)
方法
启动Java Applet时,如果用户信任发布者,则会提示用户接受证书:
即使我接受它,也会发生异常。 即使我安装了证书,并且自动接受了提示消息,也会发生异常。
我也试过这个:
AccessController.doPrivileged(new PrivilegedAction<Object>() {
public Object run() {
ClassLoader.getSystemClassLoader().getResource("aResource");
return null;
}
});
它失败了同样的例外。
任何帮助,将不胜感激!
最后我找到了答案!
我遵循了Andrew Thomson的指导方针,并创建了一个自定义的SecurityManager 。 我的小安全经理看起来像这样:
private class MySecurityManager extends SecurityManager {
@Override
public void checkPermission(Permission perm) {
return;
}
}
它是一个被忽视的安全管理器,它接受所有权限。 应该改进它,只允许在运行时获取系统ClassLoader。
为了使用我丑陋的SecurityManager,我在Java Applet start()
方法的开头添加了这些行:
SecurityManager sm = new MySecurityManager();
System.setSecurityManager(sm);
通过此解决方法,所有过程都按预期工作!
也许存在其他(更好的)解决方案,但它对我有用。
谢谢你们!
问题是JRE只考虑原始代码库中的代码是可信的。 两种可能的解决方案是
PrivilegedAction
并从AccessController.doPrivileged(..)
方法调用它(只是发生在我身上的可能性,不确定我是否理解它的范围,完全未经测试)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.