为什么我的Java应用程序找不到密钥库文件?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (189)

我正在尝试设置一个简单的Spring应用程序来使用SSL并将其托管在Digital Ocean上。为什么我的应用程序找不到密钥库文件?

我设置的Droplet基于Ubuntu 18.04。我使用Letsencrypt获取证书,并使用指南生成PKCS文件。我已经设置了我的application.properties文件来查看jar文件的当前目录,如下所示:

security.require-ssl:true
server.ssl.key-store:keystore.p12
server.ssl.key-store-password:<password>
server.ssl.key-store-type:PKCS12
server.ssl.key-alias:<alias>

我希望这会在配置的端口上运行并启动Web服务器。但是,我在堆栈跟踪中获得的是:

Caused by: java.io.FileNotFoundException: /root/software/gimmememe/target/keystore.p12  (No such file or directory)

奇怪的是,当我在自己的Windows机器上使用相同的keystore.p12文件运行相同的jar时,运行正常:

o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 9123 (https) with context path ''
meme.Application                         : Started Application in 4.985 seconds (JVM running for 5.464)

我不认为这是Ubuntu机器上的权限问题,因为我尝试在密钥库文件上设置权限,如下所示:

-rw-r--r-- 1 root root     4274 Mar 26 18:44 keystore.p12

我使用以下命令运行我的jar文件(也尝试使用sudo infront):

java -jar gimme-meme-1.0.0.war
提问于
用户回答回答于

TL; DR:

使用classpath:例如前缀路径

server.ssl.key-store : classpath:keystore.p12

说明:

从中读取资源与classpath从文件系统中读取文件不同。当您从中读取文件时classpath,这实际上是Spring框架在幕后为您做的事情,您需要使用Class或者ClassLoadergetResourceXxx()方法(当使用前导时,两者在路径的根上有一些细微的差别/)。

例如,以下代码将从加载ReadProps类的相同路径加载属性文件:

Properties  props = new Properties();
InputStream is    = ReadProps.class.getResourceAsStream("keystore.p12");
props.load(is);

当你把它keystore放在一个JAR中时,你实际上是从它中读取它classpath,而Spring框架正在做类似于上面例子的事情。所以你应该按如下方式指定它:

server.ssl.key-store : classpath:keystore.p12

或者

server.ssl.key-store = classpath:keystore.p12

我没有检查过Spring的源代码,但是我怀疑它增加了一个导致/你的路径,所以在某种意义上它正在做类似的事情

anyObject.getClass().getResourceAsStream(
    "/" + System.getProperty("server.ssl.key-store")
);
用户回答回答于

看起来您的应用程序只是在keystore.p12文件的当前目录中查找,如下所示:

Caused by: java.io.FileNotFoundException: /root/software/gimmememe/target/keystore.p12 (No such file or directory)

最有可能的是,你需要告诉Spring Boot该文件 jar中。

例如,如果保留文件src/main/resources,gradle&maven会将该文件放在类路径的根目录下。要将此信息传递给spring启动应用程序,您需要告诉它该文件位于类路径中。

这意味着您需要设置server.ssl.key-storeclasspath:keystore.p12,以便Spring知道它需要从存档的类路径中加载密钥库。

- 编辑 -

这是一个有类似问题的人举例说明此修复程序的示例。

Github发生类似问题

扫码关注云+社区

领取腾讯云代金券