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:PropertySourcesPlaceholderConfigurer 未加载系统属性