Spring Boot未加载在application.yml中指定的密钥库

时间:2019-10-23 13:29:35

标签: spring-boot

我正在尝试运行和测试已打包到zip文件中并已在Linux VM上解压缩的Spring Boot应用程序。 zip包含应用程序需要的所有内容(至少据我所知)。当我尝试执行该应用程序时,它启动但很快失败,因为它无法加载SSH / TLS安全通信所需的密钥库。

我的application.yml中包含以下内容:

server:
  port: 8091
  ssl:
    enabled: true
    protocol: TLS
    trust-store-type: JKS
    trust-store: classpath:keystore/server.keystore
    trust-store-password: <hidden>
    key-store-type: JKS
    key-store: classpath:keystore/ra/server.keystore
    key-store-password: <hidden>

测试系统上的目录结构如下:

[centos@route-assessor route-assessor]$ ls -R                                                                          
.:                                                                                                                     
config  elastic-apm-agent-1.10.0.jar  lib  run-route-assessor.sh  services-0.0.1-SNAPSHOT.jar           

./config:                                                                                                              
application.yml  keystore  log4j2.xml                                                                                  

./config/keystore:                                                                                                     
mp  ra  rg  server.keystore                                                                                            

./config/keystore/mp:                                                                                                  
server.keystore                                                                                                        

./config/keystore/ra:                                                                                                  
server.keystore                                                                                                        

./config/keystore/rg:                                                                                                  
server.keystore                                                                                                        

./lib
<dependency jars>

这是抛出的异常:

[2019-10-23 13:21:31.419] main WARN : context.AnnotationConfigServletWebServerApplicationContext:557 - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.boot.web.server.WebServerException: Could not load key store 'classpath:keystore/server.keystore'

Spring Boot的“运行时”显然可以看到并访问config目录,但似乎看不到其中包含的keystore目录。我需要在application.yml中指定不同的路径,还是需要将密钥库文件放在其他位置?

注意:我可以使用Eclipse中配置的application.yml运行此应用程序,而不会出现任何问题。当然,针对这种情况,所有资源都位于src/main/resources中。

更新

按照@borban的建议,我对application.yml进行了如下修改:

    key-store: file:config/keystore/ra/server.keystore
    trust-store: file:config/keystore/server.keystore

这似乎已经解决了一个问题,但我还没有走出困境:

[2019-10-23 15:07:17.671] main ERROR: boot.SpringApplication:821 - Application run failed
org.springframework.boot.web.server.WebServerException: Unable to start embedded Jetty server
...
Caused by: java.lang.IllegalStateException: no valid keystore
...

据我所知,我的密钥库文件有效且正确(我在Windows开发工具箱中使用它们已有几个月了)。它们被复制为zip分发的一部分。可能有什么我想念的吗?

我也有点担心日志中的其他消息。我不确定它们是否相关,但是似乎它们可能是:

[2019-10-23 15:07:10.153] main WARN : resource.Resource:126 - java.lang.IllegalArgumentException: URI is not hierarchical 
[2019-10-23 15:07:10.155] main WARN : resource.Resource:126 - java.lang.IllegalArgumentException: URI is not hierarchical 

我不记得以前见过他们。

2 个答案:

答案 0 :(得分:1)

您是否正在尝试从类路径之外并且从文件系统本身访问此密钥库?从您提供的文件夹结构来看,情况似乎确实如此。如果您删除“ classpath”前缀,然后适当地更新路径,则它应该起作用。

在这篇文章中,您似乎必须以“ file”为前缀

https://maven.apache.org/plugins/maven-resources-plugin/examples/resource-directory.html

答案 1 :(得分:0)

您可以使用Maven资源插件将所需的文件夹添加到插件:

https://maven.apache.org/plugins/maven-resources-plugin/examples/resource-directory.html

然后在没有类路径的情况下使用?