如何正确地将密钥库打包到.jar文件中

3

我正在开发(尤其是部署)一个客户端服务器应用程序的最后一步,其中我使用TLS进行了安全连接。我已经为客户端和服务器获取了密钥库和信任库,目前我在创建SSLSocket / SSLServerSocket之前将它们作为SystemProperties加载,代码如下:

    Properties systemProperties = System.getProperties();
    systemProperties.put("javax.net.ssl.keyStore", "./auth/labkey.jks");
    systemProperties.put("javax.net.ssl.keyStorePassword", "<somepassword>");
    systemProperties.put("javax.net.ssl.trustStore", "./auth/labtrust.jks");
    systemProperties.put("javax.net.ssl.trustStorePassword", "<somepassword>");
    System.setProperties(systemProperties);

这在使用时很好,但正如我之前想的那样,在将所有内容打包成 .jar 文件时就无法使用了。目前,我的项目文件夹包括一个普通的 src 文件夹,其中我保存了所有带有源代码文件的包。密钥库和信任库保存在一个名为“auth”的文件夹中,该文件夹与 src 文件夹处于同一级别。

我知道从以前的项目中,当打包附加文件到 .jar 中时,相对路径会更改,但是首先我不知道我应该如何正确地处理这些文件,使它们被打包到 .jar 中(当前只有在源文件夹中为它们创建包或声明 auth 文件夹为其他源文件夹时才包含它们)。

我尝试了两种方法,并测试了很多不同的相对路径(这是第二个问题:找到合适的相对路径),但我无法弄清楚如何正确地引用它们。

非常感谢任何建议或提示。


编辑:

在上下文中尝试了几件事情后,我可以将问题缩小到 keystore 和 truststore 文件的路径是我的实际问题。 我很确定如果我能够相对地访问它们,那么会有一个可以使用的选项,但是为了访问这些文件,我必须以任何方式提供路径,无论我使用哪种方法。 我无法获得正确的相对文件路径是主要问题,我需要解决这个问题。

因此,以下问题浮现在我的脑海中:

  1. 我如何将这些文件正确添加到 .jar 中?
  2. 我需要将 auth 文件夹作为源文件夹还是需要将其放在包中,或者有没有必要或可能通过配置构建路径来正确地配置这些文件?
  3. 然后文件的相对路径将是什么?
1个回答

1

快速编辑:这个问题以前在其他帖子中已经得到了解答 - 我相信我的解释可能不够好,但最近我也遇到了这个问题,这是我的解决方案

你可能想使用getClass().getClassLoader.getResourceAsStream("filename.properties")

    Properties properties = new Properties();
    String propertiesFileName = "config.properties";

    inputStream = getClass().getClassLoader().getResourceAsStream(propertiesFileName);

    if (inputStream != null) {
        properties.load(inputStream);
    } else {
        throw new FileNotFoundException("property file '" + propertiesFileName + "' not found.");
    }

谢谢您的建议。听起来很有前途,我会尽快测试它,因为我已经认为我可能需要某种ClassLoader。不过我有一个问题:您在这里放置的“config.properties”是“labkey.jks”的等效文件吗?或者您对我如何引用密钥库文件有什么建议? - Samaranth
希望这有所帮助。回答你的问题,是的,那就是你要用来替换你自己代码中的部分 - 我只是想展示一下我工作中使用getResourceAsStream()的一个例子。 - Chris Katnic
非常感谢您的建议。我还没有成功地弄清楚如何使您的解决方案适用于我,但由于现在已经很晚了,明天我会尝试正确地实施它,等我不像现在这样疲倦时,我会尽快提供更新。 - Samaranth
所以我现在重新分析了我的选项,并得出结论,我的主要问题是:1)我不知道在.jar中引用我的文件的路径是什么,2)我认为我不需要使用类加载器加载文件,因为我传递系统属性两个参数,其中一个参数指定正在配置的是KeyStore还是Truststore,第二个参数是它的位置。因此,在任何情况下,我都需要指定其类型和路径,这归结为路径是我的主要问题。 - Samaranth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接