spring-boot 可执行文件 war 未找到密钥库

spring-boot executable war keystore not found

我构建 spring-boot 可执行文件 war 支持 ssl。 我的 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'

中表示

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

原回答

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

Tomcat requires the key store (and trust store if you’re using one) to be directly accessible on the filesystem, i.e. it cannot be read from within a jar file.

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

执行以下步骤生成 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

注意:邮递员请记住,Self-signed SSL 证书被阻止: 通过在“设置”>“通用”

中关闭 'SSL certificate verification' 来解决此问题

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