[英]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.