Java SSL密钥库(.jks)放在哪里,以及如何从.jar访问它?
我正在开发一个Java应用程序,它使用SSL与MongoDb通信。该应用程序被设计成打包成一个.jar文件,然后在Docker容器中运行。MongoDb要求您设置JVM系统属性以使SSL正常工作:Java SSL密钥库(.jks)放在哪里,以及如何从.jar访问它?,java,mongodb,ssl,jar,keystore,Java,Mongodb,Ssl,Jar,Keystore,我正在开发一个Java应用程序,它使用SSL与MongoDb通信。该应用程序被设计成打包成一个.jar文件,然后在Docker容器中运行。MongoDb要求您设置JVM系统属性以使SSL正常工作: System.setProperty("javax.net.ssl.keyStore", pathToJKS); System.setProperty("javax.net.ssl.keyStorePassword", pw); 我现在的问题是,我不知道将.jks文件放在哪里,并指定正确的路径,以
System.setProperty("javax.net.ssl.keyStore", pathToJKS);
System.setProperty("javax.net.ssl.keyStorePassword", pw);
我现在的问题是,我不知道将.jks文件放在哪里,并指定正确的路径,以便我的应用程序能够在运行时访问它
目前,我的.jks文件位于resources文件夹(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文件访问它(通过路径)?所有环境都使用相同的密钥库吗?如果是这样的话,那么我会像你现在做的那样包括在内。如果没有,则只需将密钥库路径添加为启动中包含的必需参数,例如:
java -jar <jar-file>.jar -Dkeystore.location=/some/location/to/keystore.jks
然后执行与此类似的操作以加载它(我想这已经包括在内了,但是嘿):
在创建的测试类文件夹中,包含keystore.jks文件的子文件夹src 测试类:
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
jar cvfe test.jar Test *.class src/keystore.jks
java -jar test.jar /src/keystore.jks