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

Posted

技术标签:

【中文标题】Spring Boot 未加载 application.yml 中指定的密钥库【英文标题】:Spring Boot not loading keystore specified in application.yml 【发布时间】:2020-02-19 18:28:20 【问题描述】:

我正在尝试运行和测试已打包成 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 

我不记得以前见过他们。

【问题讨论】:

【参考方案1】:

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

从这篇文章看来,您必须以“文件”为前缀

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

【讨论】:

重新插入您的原始链接。 ***.com/questions/19613562/…【参考方案2】:

您可以使用maven资源插件将您需要的文件夹添加到插件中:

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

然后不使用类路径??

【讨论】:

以上是关于Spring Boot 未加载 application.yml 中指定的密钥库的主要内容,如果未能解决你的问题,请参考以下文章

Spring-Boot MVC 模板未加载(未找到 404)

Spring Boot 索引未加载

Spring Boot 模板文件未加载

Spring Boot:PropertySourcesPlaceholderConfigurer 未加载系统属性

Spring Boot Security 自定义登录页面未加载

Spring Boot 全局控制器建议未在 Spring 上下文中加载