【问题标题】:spring-boot executable war keystore not found找不到spring-boot可执行war密钥库
【发布时间】: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'

【问题讨论】:

    标签: tomcat ssl spring-boot war keystore


    【解决方案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您的回答添加一些解释,包括您所做的假设。
    猜你喜欢
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-08
    • 2022-01-14
    • 2017-01-27
    • 2021-02-08
    • 1970-01-01
    相关资源
    最近更新 更多