最近我已经迁移到 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 类中为 JMS 文档引用了 TLS CipherSpecs 和 CipherSuites以映射密码套件名称。我在我的应用程序中使用了一些Equivalent CipherSuite (Oracle JRE)列值,这些值也已在 IBM MQ 中可用。但仍然遇到问题。
在我找到这个建议将此参数添加到 IBM MQ 的 JRE 的答案-Dcom.ibm.mq.cfg.useIBMCipherMappings=false
之后(据我所知)。这可能允许 IBM MQ 使用 Oracle 编译的密码套件名称。我的问题是,
- 如何将此 JVM 参数添加
-Dcom.ibm.mq.cfg.useIBMCipherMappings=false
到 IBM MQ JRE?
This Problem Connecting a Java Client (JMS) to a IBM MQ question 建议需要将相同的参数作为系统属性添加到应用程序中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
使用带有选项队列管理器的工具创建key.kdb
文件后,可以成功读取其中的证书。此外,我还包含了一个标有. 但是现在我在客户端遇到了一个不同的异常;ikeyman
stash
ibmwebspheremq<lowercase_queue_manage_name>
Exception in thread "main" com.ibm.mq.MQException: MQJE001: Completion Code '2', Reason '2059'.
at com.ibm.mq.MQManagedConnectionJ11.<init>(MQManagedConnectionJ11.java:255)
at com.ibm.mq.MQClientManagedConnectionFactoryJ11._createManagedConnection(MQClientManagedConnectionFactoryJ11.java:450)
at com.ibm.mq.MQClientManagedConnectionFactoryJ11.createManagedConnection(MQClientManagedConnectionFactoryJ11.java:487)
at com.ibm.mq.StoredManagedConnection.<init>(StoredManagedConnection.java:97)
在 MQ 日志中我可以找到这个条目;
AMQ9637E: Channel is lacking a certificate.
有一些解释。