java - 在哪里放置 SSL keystore (.jks) 以及如何从 .jar 访问它?

标签 java mongodb ssl jar keystore

我正在开发一个使用 SSLMongoDb 通信的 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/

相关文章:

javascript - node.js/express 路由中的 Mongoose 组查询

mongodb - 对我的案例MongoDB模式设计的看法

android - 如何为将来的连接存储 "untrusted/selfsigned"证书

java.security.NoSuchAlgorithmException 在 Spring 的 RestTemplate 做请求时

java - Mongodb First insert 比 rest 慢

c# - 以编程方式设置绑定(bind)以要求在 iis 中进行客户端证书协商

java - RichFaces 或 JSF 中是否有一个选项卡控件不会呈现丑陋的嵌套表?

用于计算模逆的 Java 程序输出大于 10 的数字的负值

java - JWT 无法将访问 token 转换为 JSON

java - 如何在maven中测试之前取消设置环境变量