我需要从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
进行测试,因为同源策略。
答案 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;
}
}
});
然后你可以读取文件并将内容作为字节数组