4

私は小さな Java アプレットを持っていますが、厄介な問題があります。jarsigner ツールを使用して、独自のキーストアで JARに署名しました (次の手順に従います)。

Java アプレットは署名付き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 アプレットが起動されると、発行元を信頼している場合、ユーザーは証明書を受け入れるように求められます。

ユーザーへのメッセージ

受け入れても例外が発生しました。証明書をインストールし、プロンプト メッセージが自動的に受け入れられても、例外が発生しました。

私もこれを試しました:

AccessController.doPrivileged(new PrivilegedAction<Object>() {
    public Object run() {
        ClassLoader.getSystemClassLoader().getResource("aResource");
        return null;
    }
});

そして、同じ例外で失敗します。

どんな助けでも大歓迎です!

4

2 に答える 2

8

最後に私は答えを見つけました!

Andrew Thomsonのガイドラインに従い、カスタムのSecurityManagerを作成しました。私の小さなセキュリティマネージャーは次のようになります。

private class MySecurityManager extends SecurityManager {
    @Override
    public void checkPermission(Permission perm) {
        return;
    }
}

すべての権限を受け入れる放置されたセキュリティ マネージャです。実行時にシステム ClassLoader のみを取得できるように改善する必要があります。

見苦しい SecurityManager を使用するために、Java アプレットstart()メソッドの先頭に次の行を追加しました。

SecurityManager sm = new MySecurityManager();
System.setSecurityManager(sm);

この回避策により、すべてのプロセスが期待どおりに機能しました。

他の(より良い)解決策が存在するかもしれませんが、私にとってはうまくいきました。

皆さん、ありがとうございました!

于 2012-07-03T14:42:42.773 に答える
2

問題は、JRE が元のコードベースのコードのみを信頼できると見なすことです。考えられる解決策は次の 2 つです。

  1. 新しいコードが必要な特権を持つことを許可するカスタム セキュリティ マネージャーを設定します。
  2. 新しいコードをラップしてメソッドPrivilegedActionから呼び出しますAccessController.doPrivileged(..)(完全にテストされていないため、その範囲を理解しているかどうかはわかりませんが、可能性として思い浮かびました)。
于 2012-07-03T09:13:27.903 に答える