2 回答

TA貢獻1798條經驗 獲得超7個贊
經過一段時間的工作,我能夠解決這個問題。從一開始我就在應用程序端遇到了這個證書配置問題。即使在創建self-signed標記為之后的證書并使用工具ibmwebspheremq<queue_manager_name>與客戶端應用程序共享提取的證書之后,也會發生這種情況。ikeymanAMQ9637E: Channel is lacking a certificate.
簡而言之,為了完全解決這個問題,我做了以下事情;
將客戶端 MQ 依賴項更新為com.ibm.mq.allclient:v9.1.2.0. 如果您使用的是 Maven,請使用以下依賴項(MQC91:IBM MQ 客戶端)。
<dependency>
<groupId>com.ibm.mq</groupId>
<artifactId>com.ibm.mq.allclient</artifactId>
<version>9.1.2.0</version>
</dependency>
現在,如果應用程序在 Oracle JVM 上運行,我們應該說服 MQ 客戶端庫使用 Oracle JVM 兼容的密碼套件名稱。為此,請將其添加-Dcom.ibm.mq.cfg.useIBMCipherMappings=false為 JVM 標志或將其添加System.setProperty("com.ibm.mq.cfg.useIBMCipherMappings", "false")為系統屬性。
選擇適當的密碼套件與 MQ 通信。IBM MQ classes for JMS 文檔中的TLS CipherSpecs 和 CipherSuites將很有幫助,因為 IBM 已經棄用了IBMMQ 9 之后的一些弱密碼規范。
我建議使用ECDHE_*密碼規范,因為它們提供Ephemeral Keys來維護Forward Secrecy。
然后,使用ikeymanGUI 工具,我創建了一個self-signed以名稱標記的證書ibmwebspheremq<queue_manager_name>,而不是提取.arm文件,我將證書導出為.jks文件。keystore.jks和文件都truststore.jks從同一個證書中導出。之后,使用系統屬性將它們附加到應用程序;
System.setProperty("javax.net.ssl.trustStore", "truststore.jks");
System.setProperty("javax.net.ssl.trustStorePassword", "<password>");
System.setProperty("javax.net.ssl.keyStore", "keystore.jks");
System.setProperty("javax.net.ssl.keyStorePassword", "<password>");
通過此配置,SSL 握手問題消失了,但 IBM MQ 仍要求使用用戶名和密碼進行用戶身份驗證。為了提供它們,應該將這些屬性添加到MQEnvironment,
MQEnvironment.properties.put(com.ibm.mq.constants.CMQC.USER_ID_PROPERTY, "<user_name>");
MQEnvironment.properties.put(com.ibm.mq.constants.CMQC.PASSWORD_PROPERTY, "<password>");
在我的案例中,這些憑據是系統憑據。
如果您只是想像這樣跳過用戶身份驗證,您可以runmqsc像這樣使用 CLI 工具更新 IBMMQ 配置以跳過憑證檢查(請參閱此在隊列管理器文檔上打開連接身份驗證),
ALTER QMGR CONNAUTH(USE.PW)
DEFINE AUTHINFO(USE.PW) +
AUTHTYPE(IDPWOS) +
FAILDLAY(10) +
CHCKLOCL(OPTIONAL) +
CHCKCLNT(OPTIONAL)
REFRESH SECURITY TYPE(CONNAUTH)
請注意,CHCKCLNT需要將值設置為OPTIONAL忽略客戶端用戶憑據檢查。IBM MQ 應該開始使用客戶端應用程序,同時在這些配置后啟用 SSL。

TA貢獻1773條經驗 獲得超3個贊
注意:在已刪除的評論中添加答案以捕獲提供給 OP 的信息。
有關顯示與 MQ v9.1 的證書類型兼容性的表格,請參閱以下 IBM MQ 知識中心頁面:
IBM MQ 9.1.x/IBM MQ/安全/消息的機密性/啟用密碼規范
密碼ECDHE_ECDSA
需要隊列管理器的套件 b 證書。如果為您的應用程序使用客戶端證書,它還需要是套件 b。
請注意,您可以使用ECDHE_RSA
非套件 b 證書的密碼。
隊列管理器使用存儲文件 ( key.sth for example
) 來訪問該kdb
文件??蛻舳说?java 等效項是您指定 jks 密碼。
添加回答
舉報