我正在开发一个使用 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执行应用程序,但当然从app.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文件中访问它(通过路径)?
答案 0 :(得分:1)
用于所有环境的密钥库是否相同?如果是这样,那么我会包括你正在做的事情。如果没有,那么只需将keystore-path添加为启动中包含的必需参数,例如:
java -jar <jar-file>.jar -Dkeystore.location=/some/location/to/keystore.jks
否则,以下内容应该可以检索位于resources-folder中的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);
答案 1 :(得分:0)
在Created Test Class文件夹中,subFolder src中包含keystore.jks文件。
识别TestClass:
import java.io.*;
public class Test{
public static void main(String... args){
String fileName = args[0];
new Test().readFile(fileName);
}
void readFile(String fileName){
try {
InputStream in = getClass().getResourceAsStream(fileName);
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(in, "password".toCharArray());
Enumeration enumeration = keyStore.aliases();
while(enumeration.hasMoreElements()) {
String alias = (String)enumeration.nextElement();
System.out.println("alias name: " + alias);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用以下命令生成jar:
jar cvfe test.jar Test *.class src/keystore.jks
执行jar文件,它读取jar内的密钥库。
java -jar test.jar /src/keystore.jks