Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在OpenShift环境中部署秘密Java密钥存储的好方法是什么?_Openshift_Client Certificates - Fatal编程技术网

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

在OpenShift环境中部署秘密Java密钥存储的好方法是什么?,openshift,client-certificates,Openshift,Client Certificates,我们有一个JavaWeb应用程序,它应该从常规部署模型(安装在服务器上)移动到OpenShift环境(部署为docker容器)。目前,该应用程序使用一组Java密钥存储(.jks文件)来存储客户端证书,以便与第三方web接口通信。我们每个接口有一个密钥存储 这些jks文件在生产机器上手动部署,并且在需要更新第三方证书时偶尔更新。我们的应用程序有一个指向密钥存储文件的路径设置,启动时它将从这些文件中读取证书,然后使用它们与第三方系统通信 现在,当移动到OpenShift部署时,我们有一个docke

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

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

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

由于这些证书是一个秘密,我们不想将它们烘焙到图像中。我扫描了OpenShift文档,寻找一些关于如何实现这一点的线索,基本上找到了两种选择:使用机密或安装持久卷声明(PVC)

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


对于需要将文件放入容器中的问题,您是否找到了一个聪明的解决方案?

事实证明,我误解了秘密的工作原理。它们确实是可以作为文件装载的键值对。但是,该值可以是任何将映射为文件内容的base64编码二进制文件。因此,解决方案是首先将JKS文件的内容编码为base64:

cat keystore.jks| base64
然后你可以将其放入你的秘密定义中:

apiVersion: v1
kind: Secret
metadata:
  name: my-secret
  namespace: my-namespace
data:
  keystore.jks: "<base 64 from previous command here>"
这将在
/mnt/secrets
处装载机密卷
secrets
,并使名为
keystore.jks
的条目作为
/mnt/secrets
下的文件
keystore.jks
可用


我不确定这是否真的是一种很好的方法,但至少在这里是有效的。

您可以添加和挂载Jan Thomä所述的秘密,但使用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
然后可以通过UI:Applications->Deployments->->“Add config files”添加 在那里你可以选择什么秘密,你想挂载在哪里


请注意,name=value对(例如truststore.jks=)将像filename=base64解码内容一样使用

基于@Frischling和@Jan Thomä所说的内容,并与Frischling达成一致,因为他的方法更简单,并且在将密钥库作为机密添加后,在
应用程序->部署->下[您的部署名称]
单击环境链接并添加以下系统属性:
名称:JAVA\u选择\u追加
Value
-Djavax.net.ssl.keyStorePassword=changeme-Djavax.net.ssl.keyStore=/mnt/keystores/your_cert\u key\u store.jks-Djavax.net.ssl.trustStorePassword=changeme-Djavax.net.ssl.trustStore=/mnt/keystores/your_ca\u key\u store.jks



如图所示,这将有效地将密钥库文件路径、密码附加到应用程序使用的java选项中,例如JBoss/WildFly或Tomcat

我生成的base64是多行的,我得到了相同的错误

诀窍是,在base64中使用-w0参数,以便整个编码在一行中

base64 -w0 ssl_keystore.jks > test
上面将创建一个名为test的文件,并在一行中包含base64,复制粘贴方式如下:

apiVersion: v1
kind: Secret
metadata:
  name: staging-ssl-keystore-jks
  namespace: staging-space
type: Opaque
data:
  keystore.jsk: your-base64-in-one-line

那么您将如何使用此密钥库?通过将其重新转换为JKS格式或其他方式,密钥存储将装入容器中的文件夹中。例如,在上面的示例中,它被装载到/mnt/secrets/keystore.jks。从那里,您可以使用标准的密钥库API(例如,
keystore ks=keystore.getInstance(“JKS”);InputStream readStream=new FileInputStream(“/mnt/secrets/keystore.JKS”);ks.load(readStream,keystrepasswordcharray);
。可以将机密链接到服务帐户,以便将内容作为文件注入容器中。请参见此处-但是,文档没有阐明装载机密的路径。有什么想法吗?值得注意的是,此解决方案可能会导致使用配置映射和系统属性将处于未加密状态的日志密码导入控制台rty注入可能更好,对吧?虽然他们登录到shell后仍然可以看到它们,所以配置映射可能不好,但唯一的替代方法是在应用程序中硬编码它们,对吗?
apiVersion: v1
kind: Secret
metadata:
  name: staging-ssl-keystore-jks
  namespace: staging-space
type: Opaque
data:
  keystore.jsk: your-base64-in-one-line