如何在 PCF 中存储一个小的机密文件,以便 Spring 启动应用程序可以访问它

How to store a small Confidential file in PCF so that a Spring boot App can access it

我必须将我的 Kafka Keystore.jksTruststore.jks 文件存储在 PCF 中,以便我的 spring 引导应用程序在那里运行可以使用它来访问集群。

我想到的解决方案如下。 我的 Jenkins 管道连接到 Hashicorp Vault。所以我可以将 BASE64 编码的内容保存在 Vault 中,并在部署期间从那里读取它。但我不知道如何在我的 Java 应用程序启动之前将该内容作为文件转储到 PCF VM 中。我试图追求 .profile 路线;不幸的是 Java 构建包不支持 .profile。任何指点将不胜感激,谢谢!

您可以使用 spring-cloud-vault 插件让 spring-boot bootstrap 在应用程序启动时从保险库中获取您的秘密。
Spring-cloud-vault plugin

但我不明白为什么您需要将 JKS 文件放在保险库中。 这些 JKS 文件受密码保护,这意味着您可以将 jks 文件作为资源捆绑在您的 JAR 中,并在应用程序启动时获取从保险库打开这些 JKS 文件所需的秘密密码

几个选项:

  1. 将受密码保护的 JKS 文件作为文件放入您的应用程序中。使用环境变量、用户提供的服务、通过 Spring 配置服务器或通过 CredHub 服务代理传递密码以读取它们。

  2. 与 #1 相同,但创建一个用于安装 JKS 文件的小型自定义构建包。首先使用平台 multi-buildpack 功能 运行 您的自定义构建包,然后使用 Java 构建包。如果您有许多使用相同 JKS 文件的应用程序,此选项会更方便一些。

  3. Base64 编码您的 JKS 文件并将它们填充到环境变量、用户提供的服务、Spring 配置服务器或通过 CredHub 服务代理。在您的应用程序启动时检索并解码它们,在 .profile 文件或应用程序本身中。

构建 JAR 文件时,您可以 运行 运行 jar uf <path/to/file.jar> .profile 它将 .profile 文件添加到 JAR 的根目录。

您可以通过运行宁jar tf <path/to/file.jar>确认它在正确的位置。输出应该是这样的...

...
BOOT-INF/lib/jackson-annotations-2.9.0.jar
BOOT-INF/lib/jackson-core-2.9.6.jar
BOOT-INF/lib/reactive-streams-1.0.2.jar
BOOT-INF/lib/logback-core-1.2.3.jar
BOOT-INF/lib/log4j-api-2.10.0.jar
<rest of your files here>
... 
.profile

注意 .profile 前面没有路径。这就是它需要正常工作的地方。

希望对您有所帮助!

我创建了一个新的供应构建包来帮助解决这个问题

https://github.com/starkandwayne/dot-profile-buildpack

cf push javaapp --path build/jibs/myapp-1.0.0.jar \
  -b https://github.com/starkandwayne/dot-profile-buildpack \
  -b java_buildpack \
  --no-start
cf set-env javaapp PROFILED "$(cat <<SHELL
#!/bin/bash

cat > config.json <<JSON
{
  "some": "config"
}
JSON
SHELL
)"
cf start javaapp

当然,您也可以在 cf push -f manifest.yml.

中设置 $PROFILED env var