我正在以编程方式操纵默认的Java TrustStore。为此,我需要它的路径。
我尝试阅读;
和reader = csv.DictReader(csvfile, delimiter=';')
,但它们均未定义。
我想到了javax.net.ssl.keyStore
,这是正确的方法吗?
它可以工作,但是我希望代码尽可能具有可移植性和面向未来。
编辑:
答案 0 :(得分:2)
不。您可能没有权限修改已安装的JRE中的文件。从Java 9开始,该路径不存在。
此外,从Java 11开始,没有JRE。分发应用程序的唯一方法是使用jlink创建包含Java SE子集的映像,该子集仅包含应用程序所需的模块。
总而言之,您不能依赖Java安装,即使找到了Java安装,也不能依赖默认密钥库文件的存在。
无论如何,您都不应该更改用户的Java安装。您的代码应包含一个自定义密钥库文件作为应用程序resource,您应将其传递给Keystore.load:
InputStream embeddedKeystore =
MyApplication.class.getResourceAsStream("custom-keystore.pkcs");
assert embeddedKeystore != null : "Application was not properly built."
+ " Keystore is missing!";
KeyStore keystore = KeyStore.getInstance("pkcs12");
keystore.load(embeddedKeystore,
new char[] { 's', 'w', 'o', 'r', 'd', 'f', 'i', 's', 'h' });
embeddedKeystore.close();
答案 1 :(得分:0)
到目前为止,发布我的解决方案。
在我的问题中,我正在从System.getenv("JAVA_HOME") + "/jre/lib/security/cacerts"
中读取内容,但这是JDK的路径(该路径未安装在AWS Lambda上),并且是/ jre文件夹的根。
String trustStoreLocation = Optional.ofNullable(System.getProperty("javax.net.ssl.trustStore"))
.orElseGet(() -> System.getProperty("java.home") + "/lib/security/cacerts");
File trustStoreFile = new File(trustStoreLocation);
if (!trustStoreFile.exists()) {
throw new RuntimeException("Unable to locate the Java TrustStore: the system property javax.net.ssl.trustStore is undefined or " + trustStoreLocation + " does not exist.");
}
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
try (FileInputStream fis = new FileInputStream(trustStoreFile)) {
keyStore.load(fis, new char[] { 't','h','e',' ','p','a','s','s','w','o','r','d' });
}
答案 2 :(得分:0)
您可以使用将系统属性选项传递给JVM的方式来使用trustsotre和密钥库的自己的路径
-Djavax.net.ssl.keyStore=your_custom_path
-Djavax.net.ssl.trustStore=your_custom_path