找不到spring-boot可执行war密钥库

Posted

技术标签:

【中文标题】找不到spring-boot可执行war密钥库【英文标题】:spring-boot executable war keystore not found 【发布时间】:2015-12-27 18:35:15 【问题描述】:

我构建了带有 ssl 支持的 spring-boot 可执行战争。 我的 application.properties 文件是:

server.port = 8443
server.ssl.key-store = classpath:keystore.jks
server.ssl.key-store-password = secret
server.ssl.key-password = another-secret

WAR 文件包含“keystore.jks”文件。但我得到了奇怪的例外:

org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.boot.context.embedded.EmbeddedServletContainerException: Could not find key store classpath:keystore.jks

Caused by: java.io.FileNotFoundException: class path resource [keystore.jks] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/D:/projects/vi3na/vi3na.web/target/vi3na.war!/WEB-INF/classes!/keystore.jks

符号“!”是什么意思?意思是路径'D:/projects/vi3na/vi3na.web/target/vi3na.war!/WEB-INF/classes!/keystore.jks'

【问题讨论】:

【参考方案1】:

更新:由于this enhancement request,下面描述的限制不再适用。 Tomcat 8.0.28+ 和 7.0.66+ 可以从 jar 文件中加载密钥库。

原答案

我猜您是在使用 Tomcat 作为嵌入式 servlet 容器?作为noted in the reference documentation,Tomcat 目前不支持从 jar 中加载密钥库或信任库:

Tomcat 需要在文件系统上直接访问密钥存储(以及信任存储,如果您使用的话),即不能从 jar 文件中读取。

您应该将 keystore.jks 从 jar 中移出并更新 server.ssl.key-store 及其在文件系统上的位置。

【讨论】:

谢谢。你是对的,我使用的是嵌入式 Tomcat。我需要里面的JSP引擎。我在文件系统上使用我的 keystore.jks。好答案! 嗨,安迪,请您指出 Tomcat 不能从 jar 中读取密钥库的文档,我找不到吗?我正在使用 Spring Boot 1.2.5 和 Embedded Tomcat 8.0.24,一切都很顺利;如果我尝试将 Spring Boot 升级到 1.2.7 或 1.3.0 版本(相同的嵌入式 Tomcat),我会得到与 Igor 相同的错误。所以它可能取决于 Spring Boot 而不是 Tomcat? @lincetto 我不确定 Tomcat 限制是否记录在任何地方,但 here's the enhancement request 增加了对从 JAR 中加载密钥存储的支持。 问题已得到修复,密钥库文件的类路径现在可以正常工作。我正在使用 Spring Boot 2.2.5.RELEASE @Andy Wilkinson - 我正在使用 tomcat.version 8.5.27 和 spring-boot-starter-tomcat 1.5.10.RELEASE - 我的密钥库文件存在于 jar 中并且无法读取。【参考方案2】:

在我的 Spring Boot 应用程序中,我通过将 .jks 文件放入资源文件夹解决了这个问题。

【讨论】:

我也是这样做的。但是当我将它作为 jar 运行时,它会导致 file not found 异常。有什么想法吗?【参考方案3】:

执行以下步骤生成 Java KeyStore (JKS) 并在应用程序的 application.properties 中进行配置:

1- 生成 JKS

jmendoza@jmendoza:~$ keytool -genkey -alias selfsigned_localhost_sslserver -keyalg RSA -keysize 2048 -validity 700 -keypass changeit -storepass changeit -keystore ssl-server.jks

2- 在 application.properties 中配置 JKS

server.port=8081
server.ssl.key-alias=electoralsystem-store
server.ssl.key-password=jmendoza
server.ssl.key-store=/home/jmendoza/IdeaProjects/dummy/config/electoralsystem-store.jks
server.ssl.key-store-provider=SUN
server.ssl.protocol=TLS
server.ssl.enabled-protocols=TLSv1.2

3- 从邮递员那里调用服务

https://localhost:8081/api/process

注意:请记住,自签名 SSL 证书被阻止: 通过在“设置”>“常规”中关闭“SSL 证书验证”来解决此问题

【讨论】:

感谢您提供此代码 sn-p,它可能会提供一些有限的即时帮助。 proper explanation 将通过展示为什么这是解决问题的好方法,并使其对有其他类似问题的未来读者更有用,从而大大提高其长期价值。请edit您的回答添加一些解释,包括您所做的假设。

以上是关于找不到spring-boot可执行war密钥库的主要内容,如果未能解决你的问题,请参考以下文章

spring-boot maven插件

在当前项目和存储库中可用的插件组 [] 中找不到前缀“war”的插件 [重复]

如何打一个可执行war包并使之可以部署在tomcat服务器上

可执行程序找不到lib库地址的处理方法

运行可执行文件时找不到共享库,即使共享库存在于指定路径中

在密钥库 C:\Users\alan\newapp\android\app\key.jks 中找不到别名为“上传”的密钥