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.
我不确定这是否真的是一种很好的方法,但它至少在这里工作.
您可以像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一样使用。
| 归档时间: |
|
| 查看次数: |
7988 次 |
| 最近记录: |