为了账号安全,请及时绑定邮箱和手机立即绑定

如何将 JVM 参数“-Dcom.ibm.mq.cfg.useIBMCipherMappings”

如何将 JVM 参数“-Dcom.ibm.mq.cfg.useIBMCipherMappings”

潇湘沐 2022-12-15 17:07:32
最近我已经迁移到 IBM MQ v8 到 IBM MQ v9(特别是 v9.1.2.0)。我使用 SSL 与经纪人通信。因此,根据Deprecated CipherSpecs文档,IBM 已经弃用了 MQ 8 附带的密码套件数量,并且似乎我一直在使用的所有密码套件都已被 v9 向上弃用。因此,我已经实施了新的 TLS 密码套件来处理我在 Oracle JVM(版本 1.8.0_211)上运行的应用程序。自从我在应用程序中遇到异常以来;com.ibm.mq.MQException: MQJE001: Completion Code '2', Reason '2400'.    at com.ibm.mq.MQManagedConnectionJ11.constructMQCD(MQManagedConnectionJ11.java:1437)    at com.ibm.mq.MQManagedConnectionJ11.constructCNO(MQManagedConnectionJ11.java:1537)    at com.ibm.mq.MQManagedConnectionJ11.<init>(MQManagedConnectionJ11.java:221)    ... (Omitted the rest)当我深入了解原因时,发现这是 IBM MQ 密码套件和 Oracle JRE 密码套件名称不匹配的问题。但我确实在 IBM MQ classes for JMS 文档中引用了 TLS CipherSpecs 和 CipherSuites来映射密码套件名称。我在我的应用程序中使用了一些在 IBM MQ 中也可用的Equivalent CipherSuite (Oracle JRE)列值。但仍然遇到问题。在我找到这个建议将这个参数添加到 IBM MQ 的 JRE 的答案-Dcom.ibm.mq.cfg.useIBMCipherMappings=false之后(据我所知)。这可能允许 IBM MQ 使用 Oracle 兼容的密码套件名称。我的问题是,如何将此 JVM 参数添加-Dcom.ibm.mq.cfg.useIBMCipherMappings=false到 IBM MQ JRE?这个问题将 Java 客户端 (JMS) 连接到 IBM MQ问题表明需要将相同的参数作为系统属性添加到应用程序中System.setProperty("com.ibm.mq.cfg.useIBMCipherMappings", "false"),但它没有任何不同。Java connection to WMQ 8 question 也说明了相同的解决方案,但没有提到如何将此 JVM 参数添加到 IBM MQ。更新 1我做了一些关于如何向 IBM MQ 添加 JVM 参数的研究。但我只能找到 Websphere 应用程序服务器的解决方案。我目前在应用程序中使用的 CipherSuite 是;TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256(符合 Oracle JRE)IBM MQ 有相应的;ECDHE_ECDSA_AES_128_CBC_SHA256(符合 IBM MQ)
查看完整描述

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。


查看完整回答
反对 回复 2022-12-15
?
慕容3067478

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 密码。


查看完整回答
反对 回复 2022-12-15
  • 2 回答
  • 0 关注
  • 98 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信