首页 > 解决方案 > 容器化 Springboot 应用程序 - 从 JAR 中加载嵌入式密钥库 (.jks/.p12)

问题描述

背景:我有一个使用 docker 容器化并在 kubernetes 集群上运行的 springboot 应用程序。它执行 API 调用,并依赖于需要加载 .jks 信任库的 SSLContext,如下所示:

SSLContext sslcontext = SSLContexts.custom().loadTrustMaterial(ResourceUtils.getFile(keyStoreFilePath),
                        keyStorePassword.toCharArray(), new TrustSelfSignedStrategy()).build();

请注意,字符串 keyStoreFilePath 当前在发布时作为环境/属性变量注入,并指向运行容器的主机上的 /etc/ssl/keystore.jks 之类的位置。缺点是我必须将它作为持久卷安装在 kubernetes 中,以便我的容器化应用程序访问它。

相反,我决定将它嵌入到应用程序的类路径中,这样我们的运营团队就不必在所有主机中设置它。但是当我这样做时,通过像这样指定 keyStoreFilePath 值:classpath:security/keystore.jks当我在 Eclipse/STS 中运行项目时它运行良好。但它失败,容器内出现以下错误:

class path resource [security/cacerts] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/app.jar!/BOOT-INF/classes!/security/cacerts","stackTrace":"org.springframework.util.ResourceUtils.getFile(ResourceUtils.java:217)

同样,有趣的是完全相同的东西在 Eclipse 中运行得很好,但在容器内却失败了。任何指针?

更新:验证 keystore.jks 文件的大小 < 1 MB。

标签: spring-bootdockersslkuberneteskeystore

解决方案


错误消息显示file:/<some-path-in-the-container>/App.jar!/keystore.jks- 没有“安全”文件夹,而传入的keyStoreFilePath值为classpath:security/keystore.jks

JKS 文件不太可能大于 1MB,这是 Kubernetes 对 ConfigMap-s 和 Secrets 的限制,因此可以选择使用 JKS 文件创建Secret并从 Secret 挂载卷 - 无需使用持久的体积或hostPath体积。

HTH


推荐阅读