放置SSL密钥库(.jks)的位置以及如何从.jar访问它?

时间:2017-02-16 11:44:26

标签: java mongodb ssl jar keystore

我正在开发一个使用 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文件中访问它(通过路径)?

2 个答案:

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