我正在开发一个使用 SSL 与 MongoDb 通信的 Java 应用程序。该应用程序旨在打包成一个 .jar 文件,然后在 Docker 容器中运行。 MongoDb 要求您设置 JVM 系统属性以使 SSL 工作:
System.setProperty("javax.net.ssl.keyStore", pathToJKS);
System.setProperty("javax.net.ssl.keyStorePassword", pw);
我现在的问题是我不知道将我的 .jks 文件放在哪里并指定正确的路径以便我的应用程序能够在运行时访问它?
目前,我的 .jks 文件位于资源文件夹 (src/main/resources/store.jks) 中,如果我通过 IDE 执行应用程序,这很好,但当然一旦应用程序从 .jar 执行文件,我得到一个 java.io.FileNotFoundException
。下面是我目前用来获取路径的代码。
boolean isIDE = ...;
String pathToJKS = isIDE ? "src/main/resources/store.jks" : getPathFromJar("store.jks");
public String getPathFromJar(String filename) {
ClassLoader classLoader = getClass().getClassLoader();
final URL resourceUrl = classLoader.getResource(filename);
if (resourceUrl != null) {
return resourceUrl.toExternalForm();
} else {
return null;
}
}
我的问题是放置 .jks 文件的正确位置在哪里以及如何从 .jar 文件访问它(通过路径)?
最佳答案
所有环境都使用同一个 keystore 吗?如果是这样,那么我会像您目前所做的那样包括在内。如果不是,则只需将 keystore-path 添加为启动时包含的必需参数,例如:
java -jar <jar-file>.jar -Dkeystore.location=/some/location/to/keystore.jks
否则,为了检索位于资源文件夹中的 jar 文件,应该执行以下操作:
//note the slash --v
theResource = MyClass.class.getResource("/store.jks");
// MyClass => class where the getPathFromJar()-method resides
然后只需执行与此类似的操作即可加载它(我想这已经介绍过了,但是嘿):
KeyStore.getInstance(KeyStore.getDefaultType()).load(theResource, password);
关于java - 在哪里放置 SSL keystore (.jks) 以及如何从 .jar 访问它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42273010/