以编程方式加载 Java cacerts 时出现授权错误

Authorization Error while loading Java cacerts programatically

我正在尝试在我的客户端 GUI 中以编程方式导入 X509 证书,使用此答案 Import Certificate Programatically 中描述的方法。我的代码如下所示:

char[] password = "changeit".toCharArray();
File file = fc.getSelectedFile();

char SEP = File.separatorChar;
File dir = new File (System.getProperty("java.home") + SEP + "lib" + SEP + "security");
File keystoreFile = new File(dir, "cacerts");

KeyStore trustStore  = KeyStore.getInstance(KeyStore.getDefaultType());
InputStream targetStream = new FileInputStream(file);
CertificateFactory cf = CertificateFactory.getInstance("X509");
X509Certificate c = (X509Certificate) cf.generateCertificate(targetStream);

FileInputStream in = new FileInputStream(keystoreFile);

trustStore.load(in, password);
in.close(); 


trustStore.setCertificateEntry("alias", c);
FileOutputStream out = new FileOutputStream(keystoreFile);
trustStore.store(out, password);
out.close();

但是当我 运行 程序并尝试导入它时,我得到一个异常,如:

java.io.FileNotFoundException: C:\Program Files\Java\jre1.8.0_51\lib\security\cacerts (Access is denied)

我知道密码 "changeit" 是默认密码,它是正确的,因为我使用命令行 keytool 交叉检查了它。

这里有我遗漏的东西吗?提前致谢!

解法:

感谢 Manuel 回复中的 link,我找到了解决方案。显然,Program Files 中的 Java 文件夹没有 OS 用户(写入)的正确权限。我想知道这是否是默认设置,即使在 Linux OS 的情况下?是否可以在不手动更改权限的情况下解决它?

您遇到与所述相同的问题Access is denied java.io.FileNotFoundException

您需要定义文件名,而不仅仅是代码中看到的目录:

File dir = new File (System.getProperty("java.home") + SEP + "lib" + SEP + "security");
File keystoreFile = new File(dir, "cacerts"); <-- file name missing, 'cacerts' is a directory