当前位置: 首页 > 知识库问答 >
问题:

Spring Boot未加载应用程序中指定的密钥库。yml

戴原
2023-03-14

我正在尝试运行和测试一个SpringBoot应用程序,该应用程序已打包成zip文件并在Linux虚拟机上解压。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中以不同的方式指定路径,还是需要将密钥存储库文件放在其他地方?

注意:我可以使用该应用程序运行此应用程序。yml配置如eclipse所示,没有任何问题。当然,对于这种情况,所有资源都位于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
...

据我所知,我的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个答案

郭乐湛
2023-03-14

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

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

然后使用没有类路径??

应俊爽
2023-03-14

您是否试图在类路径之外并从文件系统本身访问此密钥库?从你给出的文件夹结构来看,似乎是这样。如果删除“类路径”前缀,然后适当更新路径,它应该可以工作。

从这篇文章看来,你必须在前面加上“file”

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

 类似资料:
  • 我是拉威尔的新手,我正在尝试使用Artisan命令。。。 它显示。。。 Laravel开发服务器已启动:http://127.0.0.1:8000 但是,当我手动输入时,它不会自动启动http://127.0.0.1:8000 它显示了这个错误: RuntimeException未指定应用程序加密密钥。 有什么想法吗?我正在使用Laravel framework 5.5-dev。

  • 在我的项目中,我想使用特定于环境的属性文件。例如,如果我在开发中运行它,它应该使用应用程序。dev.properties,对于生产,它应该使用应用程序。产品属性等等。 我有下面两个文件在我的资源文件夹。 application.properties(用于生产) application.dev.properties(用于开发) 我有一个属性像下面的每个文件。 为了刺激 给德夫 我有一门课,如下所示

  • 我在过去为Azure函数使用了很多秘密,现在我试图使用一个密钥,RSA加密,4096位。这是一个私有的PuTTy.ppk键,我已经将其导出为。pem类型以满足Azure的要求。我有一个Python 3.7应用程序,我已经在其中部署了所需的功能,并尝试在应用程序设置中引用所需的键,下面的语句是: @microsoft.keyvault(secreturi=https://{thevault-addr

  • 问题内容: 我想使用URLFetch服务在Google App Engine应用程序中打开 HTTPS* 连接。为了能够 验证我的应用正在 与之通信 的服务器的SSL证书,我使用了自己的密钥库文件 。我希望在加载我的应用程序时(即在执行任何HTTPS请求之前)在热身请求中读取此文件。密钥库文件是我的WAR文件的一部分。 * 但是,我不能使用这种方法,因为HttpURLConnection在GAE的

  • 我正在使用一个spring启动应用程序,它运行我的src/main/resources/config/application。yml。 当我通过以下方式运行测试用例时: 测试代码仍在运行我的应用程序。要加载属性的yml文件。我想知道是否有可能再运行一个*。运行测试用例时的yml文件。

  • 将私钥加密变换为keystore v3标准格式。 调用: web3.eth.accounts.encrypt(privateKey, password); 参数: privateKey - String: 要加密的私钥. password - String: 用于加密的密码 返回值: Object: 加密后的keystore v3 JSON. 示例代码: web3.eth.accounts.en