打开默认Java信任库的最可移植的方法是什么?

时间:2019-06-12 13:59:50

标签: java java-8 aws-lambda keystore

我正在以编程方式操纵默认的Java TrustStore。为此,我需要它的路径。

我尝试阅读;reader = csv.DictReader(csvfile, delimiter=';') ,但它们均未定义。

我想到了javax.net.ssl.keyStore,这是正确的方法吗?

它可以工作,但是我希望代码尽可能具有可移植性和面向未来。

编辑:

  1. 这是针对在AWS Lambda中运行的应用程序,Lamda不允许自定义或提供您自己的JRE。
  2. 此问题最初是要求默认密钥库的。由于密钥库是特定于应用程序的,因此我将其更改为信任库。

3 个答案:

答案 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