簡體   English   中英

“java.security.AccessControlException:access denied”執行簽名的Java Applet

[英]“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只考慮原始代碼庫中的代碼是可信的。 兩種可能的解決方案是

  1. 設置自定義安全管理器,允許新代碼具有所需的權限。
  2. 將新代碼包裝在PrivilegedAction並從AccessController.doPrivileged(..)方法調用它(只是發生在我身上的可能性,不確定我是否理解它的范圍,完全未經測試)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM