[英]Java Client - Accessing Kubernetes cluster and MQ cluster over SSL
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);
Kubernetes java 客户端 API 代码似乎强制将.kube/config
引用的证书添加到新的信任库中,每次添加证书之前都会创建新的信任库。
这似乎发生在ClientCertifiacteAuthentication.java
类的provide(ApiClient client)
方法中:
final KeyManager[] keyManagers = SSLUtils.keyManagers(certificate, key, algo, "", null, null);
其中keyStoreFile
和keyStorePassphrase
这两个null
值会强制在其中创建一个新的信任库。
所以现在为了证明一个解决方案是可能的,我已经将这个类重写为:
final KeyManager[] keyManagers = SSLUtils.keyManagers(certificate, key, algo, "password", "C:\\tmp\\ssl\\dev\\mgr_mq.jks", "password");
使用此覆盖代码,Kubernetes 集群和 MQ 集群都可以在同一个 JVM 中通过 SSL 成功连接。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.