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
文件放入资源文件夹解决了这个问题。
我构建 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
中配置 JKSserver.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
文件放入资源文件夹解决了这个问题。