【问题标题】:Spring Boot app does not start due to SSL error on Boxfuse Dev VM由于 Boxfuse Dev VM 上的 SSL 错误,Spring Boot 应用程序无法启动
【发布时间】:2016-11-17 15:48:22
【问题描述】:

我有一个带有以下 SSL 配置的 Spring Boot 应用程序:

application.yml

server:
  port: 443
  ssl:
    key-store: classpath:keys/${BOXFUSE_ENV}.p12
    key-store-type: PKCS12
    key-alias: mydomain.com
    key-store-password: ${X_KEYSTORE_PASSWORD}

正确的特定于环境的密钥库存在于类路径中,并且在启动后可访问,已通过使用以下 PowerShell 脚本从控制台手动启动进行验证:

dev.ps1

$env:BOXFUSE_ENV="dev"
$env:X_KEYSTORE_PASSWORD="correctpassword"

java -jar target\myapp-1.0.0.12314.jar

手动启动应用程序在 localhost 成功启动后,可以在生产和开发模式下使用正确的证书。 现在,我尝试使用以下命令在 PowerShell 中将其作为 Boxfuse 应用程序启动:

boxfuse run target\myapp-1.0.0.12314.jar -env=dev "-envvars.X_KEYSTORE_PASSWORD=correctpassword"

应用无法启动此堆栈跟踪:

vb-c2b995f3 -> 2016-11-17 15:31:56.659 ERROR 636 --- [           main] o.apache.catalina.core.StandardService   : Failed
 to start connector [Connector[HTTP/1.1-443]]
vb-c2b995f3 ->
vb-c2b995f3 -> org.apache.catalina.LifecycleException: Failed to start component [Connector[HTTP/1.1-443]]
vb-c2b995f3 ->  at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:158)
vb-c2b995f3 ->  at org.apache.catalina.core.StandardService.addConnector(StandardService.java:225)
vb-c2b995f3 ->  at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer.addPreviouslyRemovedC
onnectors(TomcatEmbeddedServletContainer.java:234)
...
vb-c2b995f3 -> Caused by: java.lang.IllegalArgumentException: java.io.IOException: DerInputStream.getLength(): lengthTag
=109, too big.
vb-c2b995f3 ->  at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:103)
vb-c2b995f3 ->  at org.apache.tomcat.util.net.AbstractJsseEndpoint.initialiseSsl(AbstractJsseEndpoint.java:81)
...
vb-c2b995f3 -> Caused by: java.io.IOException: DerInputStream.getLength(): lengthTag=109, too big.
vb-c2b995f3 ->  at sun.security.util.DerInputStream.getLength(DerInputStream.java:561)
vb-c2b995f3 ->  at sun.security.util.DerValue.init(DerValue.java:365)
vb-c2b995f3 ->  at sun.security.util.DerValue.<init>(DerValue.java:320)
vb-c2b995f3 ->  at sun.security.pkcs12.PKCS12KeyStore.engineLoad(PKCS12KeyStore.java:1914)

是什么让这两种启动应用的方式有如此大的区别?我该如何解决?

UPD:通过将密钥库转换为 JKS 格式并将密钥库类型设置为 PKCS12 解决了该问题。

UPD2:问题的根本原因在这里: https://bz.apache.org/bugzilla/show_bug.cgi?id=60450

【问题讨论】:

    标签: java ssl spring-boot jce cloudcaptain


    【解决方案1】:

    密钥长度可能指向可能需要启用的 JDK 无限强度加密。见https://cloudcaptain.sh/docs/payloads/springboot#jce

    【讨论】:

    • 确实,这是我的配置中缺少的一步,但是将策略文件简单地放在 src/main/resources 中并没有帮助。它们应该位于最终可执行 JAR 文件的根目录中,还是从 BOOT-INF/类中提取?换句话说,Boxfuse的无限强度加密策略的自动拾取机制是否兼容Spring Boot Maven插件执行目标“重新打包”?编辑:我试图将策略文件放在 JAR 的根目录中 - 没有帮助。
    • 仅供参考,您可以通过在调试模式 (-X) 下运行来检查 Boxfuse 是否正确找到了无限强度的加密罐。然后,您应该会看到类似“Overriding JRE local_policy.jar with version included in payload ...”之类的消息,是的,Boxfuse 在 BOOT-INF/classes/ 中搜索它们
    • 经过进一步思考,我现在倾向于认为密钥库已损坏或未找到,但话又说回来,这并不能解释为什么完全相同的 jar 文件可以从命令行工作。但是,最好的选择可能只是快速启动调试会话并查看发生了什么boxfuse.com/docs/debugging
    • 当我将密钥库转换为 JKS 后,问题就解决了。问题是该应用程序将 cacerts/cacerts 视为 PKCS12,可能是因为 server.ssl.key-store-type 设置。如果 Boxfuse 总是将 FF cacerts 文件添加到 VM 映像中,这可能就是原因。
    猜你喜欢
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    • 2019-08-25
    • 2018-08-30
    • 2017-01-21
    • 2015-05-10
    • 2020-08-04
    相关资源
    最近更新 更多