0

私はスマートカードからの証明書を使用してファイル署名を行うアプレットを持っています。つまり、それを機能させるにはいくつかの追加のアクセス許可が必要です:ローカルマシン上のファイルとして.dllをロードする、一時ファイルを作成するなど.

関連するすべての jar は署名され、Java Web Start として開始されます。

init() メソッドから完全なロジックが呼び出されると、すべてが正常に機能するという混乱を招きます。

public void init() {
    try {
        File directory = new File("C:/Temp");
        deployPKCS11Library(directory);

        testFullCycleOnApplet("C:/somefile.txt");
    } catch (Exception e) {
        e.printStackTrace();
    }
}

init メソッドをtestFullCycleOnApplet取り出して、初期化後にボタンをクリックして実行すると、次のようになります。

java.security.AccessControlException: access denied ("java.util.PropertyPermission" "java.io.tmpdir" "read")
at java.security.AccessControlContext.checkPermission(Unknown Source)
at java.security.AccessController.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPropertyAccess(Unknown Source)
at java.lang.System.getProperty(Unknown Source)...

init メソッドには、制限されたものを実行するためのより多くの権利がありますか? 設定したJNLPファイルで

<security>
    <all-permissions /> 
</security>
4

1 に答える 1

0

この質問にはすぐに答えがあるようです:

AccessController.doPrivileged は JavaScript スレッドに署名付きアプレットのアクセス許可を与えますか?

個別の関数呼び出しに対してこの異なるセキュリティ プロファイルを使用した主な理由は、それが JavaScript から呼び出されたという事実です! この方法はうまく機能しますが、それが良い方法というわけではありません。おそらく、特権コンテキストで特定のことを行うことになるでしょう。

@SuppressWarnings({ "unchecked", "rawtypes" })
public void testFullCycleOnApplet(final String fileName){
    AccessController.doPrivileged(new PrivilegedAction() {
        public Object run() {
            doFullCycleOnApplet(fileName);
            return null; // nothing to return
        }
    });
}
于 2013-08-06T18:27:31.833 に答える