Java客户端-通过SSL访问Kubernetes集群和MQ集群

时间:2019-09-02 14:04:17

标签: java kubernetes ssl-certificate ibm-mq

Hava是一个Java客户端应用程序,可以单独使用io.kubernetes.client.ApiClient通过SSL连接到Kubernetes集群。相同的Java客户端应用程序还可以自己通过SSL连接到MQ集群。但是,同一应用程序无法同时连接到SSL上的Kubernetes集群和SSL上的MQ集群。

我认为这可能是由于在任何时候只能在JVM上配置一个SSL密钥/信任存储的事实吗?但是不知道什么是解决这个问题的最佳方法。

允许Java客户端通过SSL分别连接到Kubernetes集群和MQ集群的最简单方法是什么?

本文中显示的两种配置导致当两者一起运行时引发以下错误:

WARN  io.kubernetes.client.util.credentials.ClientCertificateAuthentication - Could not create key manager for Client Certificate authentication.
java.security.UnrecoverableKeyException: Cannot recover key

客户端应用程序的Kubernetes部分通过以下配置连接到Kubernetes集群:

String kubeConfigPath = "~/.kube/config";
apiClient = ClientBuilder.kubeconfig(
                    KubeConfig.loadKubeConfig(new FileReader(kubeConfigPath))).build();
apiClient.getHttpClient().setReadTimeout(0, TimeUnit.SECONDS);
            Configuration.setDefaultApiClient(apiClient);

客户端应用程序的Mq部分通过以下配置连接到MQ集群:

System.setProperty("javax.net.ssl.trustStore", "C:\\tmp\\ssl\\dev\\mgr_mq.jks");
System.setProperty("javax.net.ssl.trustStorePassword", "password");
System.setProperty("javax.net.ssl.keyStore", "C:\\tmp\\ssl\\dev\\mgr_mq.jks");
System.setProperty("javax.net.ssl.keyStorePassword", "password");
System.setProperty("com.ibm.mq.cfg.useIBMCipherMappings", "false");

java.net.URL ccdt = new URL("file:./config/qmgrs/mgr/AMQCLCHL.TAB");
MQQueueManager mqQueueManager = new MQQueueManager("*mgr", ccdt);

1 个答案:

答案 0 :(得分:1)

Kubernetes java client API code似乎强制将.kube/config中引用的证书添加到新的信任库中,该信任库在每次添加新证书之前都会创建新的信任库。

这似乎发生在ClientCertifiacteAuthentication.java类的provide(ApiClient client)方法中:

final KeyManager[] keyManagers = SSLUtils.keyManagers(certificate, key, algo, "", null, null);

然后在nullkeyStoreFile这两个keyStorePassphrase值中,强制在其中创建新的信任库。

所以到目前为止,为了证明可能的解决方案,我将此类重写为:

final KeyManager[] keyManagers = SSLUtils.keyManagers(certificate, key, algo, "password", "C:\\tmp\\ssl\\dev\\mgr_mq.jks", "password");

使用此替代代码,Kubernetes集群和MQ集群都可以通过SSL在同一JVM中成功连接。