如何使用Openshift机密通过SSL建立MQ客户端连接

时间:2018-06-21 12:19:45

标签: spring-boot ssl openshift ibm-mq openshift-origin

我正在尝试结合有关如何将SSL与openshift结合使用的建议: https://blog.openshift.com/openshift-demo-part-13-using-ssl/

有关如何在mq中使用ssl的信息:

Spring Configuration for JMS (Websphere MQ - SSL, Tomcat, JNDI, Non IBM JRE)

因此,我设法修改了Spring Boot Camel应用程序,使其从没有SSL的svrconn mq通道的连接变为使用SSL的连接, 通过向com.ibm.mq.jms.MQConnectionFactory bean添加SSLCipherSuite属性,并将这些VM参数添加到“运行配置” (如第二个链接文档中所述):

-Djavax.net.ssl.trustStore=C:\path-to-keystore\key.jks
-Djavax.net.ssl.trustStorePassword=topsecret
-Djavax.net.ssl.keyStore=C:\path-to-keystore\key.jks
-Djavax.net.ssl.keyStorePassword=topsecret
-Dcom.ibm.mq.cfg.useIBMCipherMappings=false

它在嵌入式Tomcat服务器上在本地运行良好,但是,我需要将其部署到Openshift,所以我的第一个冲动是 将相同的VM参数添加到用于Openshift部署的参数中,即:

-Dkubernetes.master=
-Dkubernetes.namespace=
-Dkubernetes.auth.basic.username=
-Dkubernetes.auth.basic.password=
-Dkubernetes.trust.certificates=
-Dfabric8.mode=openshift

但是它显然不起作用,例如因为我没有相同的密钥库路径。所以我调查了一下 并且了解到我必须使用可以通过CLI >> oc secrets new <<命令或通过Openshift控制台定义的机密, 但我不知道该如何进行。 我是否必须在映像中添加参数,或者在部署配置中添加环境变量或其他内容? 它必须以某种方式引用已定义的机密,并且必须通过更改每个点名称中带有下划线的方式来命名它? 因此,例如,如果我发出:

oc secrets new my-key-jks key.jks

然后我必须>>从Config Map或Secret <<

中添加值

JAVAX_NET_SSL_TRUSTSTORE my-key-jks key.jks

并增加价值:

COM_IBM_MQ_CFG_USEIBMCIPHERMAPPINGS false?

我尝试过,但是这不起作用,我向Deploymentconfigs添加了值,以便得到这样的摘录:

        "spec": {
            "containers": [
                {
                    "env": [
                        {
                            "name": "KUBERNETES_NAMESPACE",
                            "valueFrom": {
                                "fieldRef": {
                                    "apiVersion": "v1",
                                    "fieldPath": "metadata.namespace"
                                }
                            }
                        },
                        {
                            "name": "JAVAX_NET_SSL_TRUSTSTORE",
                            "valueFrom": {
                                "secretKeyRef": {
                                    "key": "key.jks",
                                    "name": "my-key-jks"
                                }
                            }
                        },

当我这样做:

  oc get dc app_name -o json

我还创建了一个sa(serviceaccount),并将他分配为项目的管理员,并分配给他使用新创建的密钥,我通过Openshift控制台进行了此操作,因此我现在没有oc CLI代码。 这也有些相关(但是对我没有多大帮助):

https://github.com/openshift/openshift-docs/issues/699

构建后,pod的状态变为>> Crash Loop Back-off <<,并且>>日志不再可用或无法加载。<<如果没有SSL,则同一应用在Openshift上运行良好。

1 个答案:

答案 0 :(得分:2)

恕我直言,您误解了您在此处指定的某些设置。

1。

您在此处指定的“ -Dkubernetes.master =“之后的VM参数是要提供给用于部署的fabric8 maven插件的。对?

此处有关身份验证/证书的参数仅用于与kubernetes进行通信,而并非旨在将密钥库数据提供给您的应用程序使用。所以我认为它们无关。

相反,您需要确保在容器内使用与本地执行相同的参数来启动应用。当然,然后您必须将参数值更改为容器内相应数据可用的位置。

2。

秘密是一种工具,可以将不想被烘焙到应用程序映像中的敏感数据添加到您的部署中。因此,例如,您的密钥库和密钥库密码可以通过秘密注入。

像您尝试的那样,将机密数据作为环境变量提供的另一种方法是将它们挂载到文件系统中,从而使机密数据可以作为文件使用。由于您的应用程序需要JKS作为文件,因此可以执行以下操作。

  1. 在部署的Web控制台中,使用“卷”部分下的“添加配置文件”链接

  2. 选择之前创建的秘密“ my-key-jks”作为“源”。

  3. 指定在您的容器内安装机密的路径,例如“ / secret”。然后点击“添加”。

  4. 然后您的jks将在容器内的路径“ /secret/key.jks”下可用,因此您的应用程序参数可以指向此路径。