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 密码。
添加回答
举报