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();
    }
}

如果我将testFullCycleOnApplet取出我的 init 方法并在初始化后单击按钮运行它,我将得到:

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 线程签名 Applet 的权限?

我对单独的函数调用有这种不同的安全配置文件的主要原因是它是从 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 回答