![](/img/trans.png)
[英]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.