从JApplet读取文件

时间:2013-08-15 18:03:57

标签: java google-chrome rsa file-permissions signing

我需要从JApplet读取证书文件(private.der)以创建RSA的PrivateKey,但我收到错误

access denied ("java.io.FilePermission" "private.der" "read")

我了解到JApplet在沙箱中运行,只要未分配,就无法访​​问文件。如果我错了,请纠正我。

我已签名并且有效:

keytool -genkey -keyalg rsa -alias myKeyName
keytool -export -alias myKeyName -file myCertName.crt

jarsigner "RSA.jar" myKeyName

但我仍然收到错误FilePermission错误。

Java代码

File f = new File("private.der");
FileInputStream fis = new FileInputStream(f);
DataInputStream dis = new DataInputStream(fis);
byte[] keyBytes = new byte[(int) f.length()];
dis.readFully(keyBytes);
dis.close();

PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory kf = KeyFactory.getInstance("RSA");
PrivateKey key = kf.generatePrivate(spec);

如果在Google Chrome中有一个用于禁用沙盒的标记/参数,请将其提交给我。我正在使用--allow-file-access-from-files --disable-web-security进行测试,因为同源策略。

2 个答案:

答案 0 :(得分:1)

签署小程序仅用于:

a)识别提供者(通常使用来自CA的证书更好)。

b)确保内容未被其他人修改。

它本身不提供安全权限。您需要授予某人在安全策略文件中签名所需的权限。

这个链接有点旧,但很好地解释了这个过程。 http://www.pawlan.com/monica/articles/signedapps/

Oracle引用指向Java Web Start应用程序而不是针对此类问题的applet,因此您可以探索它。 http://docs.oracle.com/javase/tutorial/deployment/applet/security.html

哦,顺便说一下,所有这些检查都是JVM内部的,所以我怀疑是否有任何标记/配置可以在浏览器中禁用它。

答案 1 :(得分:0)

要从文件中读取,您可以执行以下操作:

byte[] keyBytes = (byte[]) AccessController.doPrivileged(new PrivilegedAction<Object>() {
    public Object run() {
        try {
            File f = new File("<path>\\private.der");
            FileInputStream fis = new FileInputStream(f);
            DataInputStream dis = new DataInputStream(fis);
            byte[] keyBytes = new byte[(int) f.length()];
            dis.readFully(keyBytes);
            dis.close();

            return keyBytes;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
});

然后你可以读取文件并将内容作为字节数组