openshift - 在 OpenShift 环境中部署 secret Java keystore 的好方法是什么?

标签 openshift client-certificates

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

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

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

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

secret 似乎对我们不起作用,因为它们几乎只是键值对,您可以将其作为文件挂载或作为环境变量提交。它们也有大小限制。使用 PVC 理论上是可行的,但是我们首先需要有某种方法将 JKS 文件放入该卷中。一个简单的方法是启动一个 shell 容器,安装 PVC 并使用 OpenShift 命令行工具手动将文件复制到其中,但是我希望有一个稍微少一些手动的解决方案。

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

最佳答案

事实证明,我误解了 secret 的运作方式。它们确实是可以作为文件挂载的键值对。然而,该值可以是将被映射为文件内容的任何 base64 编码二进制文件。所以解决办法是先将JKS文件的内容编码为base64:

cat keystore.jks| base64

然后你可以把它放到你的 secret 定义中:
apiVersion: v1
kind: Secret
metadata:
  name: my-secret
  namespace: my-namespace
data:
  keystore.jks: "<base 64 from previous command here>"

最后,您可以通过在部署配置中引用它来将其安装到您的 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

这将挂载 secret 卷 secrets/mnt/secrets并创建名为 keystore.jks 的条目可用作文件 keystore.jks/mnt/secrets .

我不确定这是否真的是这样做的好方法,但至少在这里工作。

关于openshift - 在 OpenShift 环境中部署 secret Java keystore 的好方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48423398/

相关文章:

c# - 使用 Owin 的客户端证书身份验证

apache - 在 Apache Web 服务器上配置 2 路 SSL 客户端身份验证

.net - DoD CAC 身份验证 - .NET C#、Windows Server 2008 R2、IIS 7.5 的客户端证书问题

python-requests - Python 请求无法通过(转换后的)客户端证书获得成功响应

jenkins - 声明式 Jenkins 管道使用现有的 Kubernetes Pod 模板

openshift - 是否可以在OpenShift应用程序中更换主墨盒?

python - 如何将命令行参数从 oc start-build 传递到 dockerfile 以在 dockerfile 内设置环境变量

mysql - 如何在 OpenShift 中使用 NodeJS 服务器连接到 MySQL?

tomcat7 - 使用 openshift 可视化 tomcat 服务器输出

asp.net-web-api - 即使没有 CA 匹配,也强制 ASP.NET WebAPI 客户端发送客户端证书