在OpenShift环境中部署秘密Java密钥库的好方法是什么?

Jan*_*omä 6 client-certificates openshift

我们有一个Java Web应用程序应该从常规部署模型(在服务器上安装)转移到OpenShift环境(作为docker容器部署).目前,此应用程序使用一组Java密钥存储(.jks文件)作为客户端证书,以便与第三方Web界面进行通信.我们每个接口都有一个密钥库.

这些jks文件在生产计算机上手动部署,并且在需要更新第三方证书时偶尔会更新.我们的应用程序有一个设置,其中包含密钥存储文件的路径,在启动时,它将从中读取证书,然后使用它们与第三方系统进行通信.

现在,当转向OpenShift部署时,我们有一个docker镜像,该应用程序将用于所有环境(开发,测试和生产).所有配置都作为环境变量给出.但是我们不能将jks文件作为环境变量提供,这些文件需要安装到docker容器的文件系统中.

由于这些证书是秘密,我们不想将它们烘焙到图像中.我扫描了OpenShift文档以获取有关如何处理此问题的一些线索,并且基本上找到了两个选项:使用Secrets或安装持久卷声明(PVC).

秘密对我们来说似乎不起作用,因为它们几乎只是键值对,可以作为文件挂载或作为环境变量传递.它们也有尺寸限制.使用PVC理论上可行,但是我们需要有一些方法将JKS文件放到该卷中.一个简单的方法是启动一个安装PVC的shell容器,并使用OpenShift命令行工具手动将文件复制到其中,但我希望手动解决方案稍微少一些.

您是否找到了解决此问题或类似问题的聪明解决方案,您需要将文件放入容器中?

Jan*_*omä 10

事实证明,我误解了秘密是如何运作的.它们确实是可以作为文件挂载的键值对.但是,该值可以是任何base64编码的二进制文件,它将被映射为文件内容.所以解决方案是首先将JKS文件的内容编码为base64:

cat keystore.jks| base64
Run Code Online (Sandbox Code Playgroud)

然后你可以把它放到你的秘密定义中:

apiVersion: v1
kind: Secret
metadata:
  name: my-secret
  namespace: my-namespace
data:
  keystore.jks: "<base 64 from previous command here>"
Run Code Online (Sandbox Code Playgroud)

最后,您可以通过在部署配置中引用它将其挂载到docker容器中:

apiVersion: v1
kind: DeploymentConfig
spec:
  ...
  template:
    spec:
      ...
      container:
       - name: "my-container"
         ...
         volumeMounts:
            - name: secrets
              mountPath: /mnt/secrets
              readOnly: true

     volumes:
        - name: secrets
          secret:
            secretName: "my-secret"
            items:
              - key: keystore.jks
                path: keystore.jks
Run Code Online (Sandbox Code Playgroud)

这将安装秘密卷secrets,/mnt/secrets并使用名称keystore.jks作为文件keystore.jks下的条目进行输入/mnt/secrets.

我不确定这是否真的是一种很好的方法,但它至少在这里工作.

  • 您还可以使用“kubectl create Secret generic my-secret --from-file=keystore.jks=/path/to/file/keystore.jks”直接从文件创建 (3认同)
  • 密钥库将安装到容器中的文件夹中.例如,在上面的例子中,它被挂载到/mnt/secrets/keystore.jks.从那里你可以使用标准的密钥库API加载它(例如`KeyStore ks = KeyStore.getInstance("JKS"); InputStream readStream = new FileInputStream("/ mnt/secrets/keystore.jks"); ks.load(readStream, keystorePasswordCharArray);`. (2认同)

Fri*_*ing 6

您可以像JanThomä所说的那样添加和安装机密,但是使用oc命令行工具可以更容易地做到这一点:

./oc create secret generic crnews-keystore --from-file=keystore.jks=$HOME/git/crnews-service/src/main/resources/keystore.jks --from-file=truststore.jks=$HOME/git/crnews-service/src/main/resources/truststore.jks --type=opaque
Run Code Online (Sandbox Code Playgroud)

然后可以通过UI添加它:“应用程序”->“部署”->->“添加配置文件”,您可以在其中选择要将其装入的机密。

注意,名称=值对(例如truststore.jks =)将像filename = base64decoded-Content一样使用。