spring-boot - 容器化 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。
解决方案
推荐阅读
- reactjs - 在一些 React 状态更新后如何获取数据(通过 GET)?
- apache-kafka - 零售店环境中的 Kafka
- java - 查找字符串中子字符串的出现次数
- python - SQLAlchemy 仅将 IN 与子查询的第一个值一起使用
- typescript - 自动从单一仓库中的命名空间/类型 NPM 模块导入 Typescript 命名空间
- google-chrome - 如何在第二个单选按钮上直接将 WebRTC 网络限制器部署到 Windows 计算机
- css - 通过媒体查询调整像组件一样使用的 svg 图像的大小
- android - 为什么 CoordinatorLayout 在底部留下一个边距?
- rename - 用特定单词重命名多个文件
- c++ - 在 boost::odeint 中使用 VectorXd