0

最近我已经迁移到 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 编译的密码套件名称。我的问题是,

  1. 如何将此 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文件后,可以成功读取其中的证书。此外,我还包含了一个标有. 但是现在我在客户端遇到了一个不同的异常;ikeymanstashibmwebspheremq<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.

有一些解释。

4

2 回答 2

1

注意:添加答案以在已删除的评论中捕获提供给 OP 的信息。


有关显示与 MQ v9.1 的证书类型兼容性的表格,请参阅以下 IBM MQ 知识中心页面:

IBM MQ 9.1.x/IBM MQ/消息的安全性/机密性/启用 CipherSpecs

ECDHE_ECDSA具有队列管理器的套件 b 证书的密码。如果为您的应用程序使用客户端证书,它还需要是套件 b。

请注意,您可以将ECDHE_RSA密码与非套件 b 证书一起使用。


队列管理器使用存储文件 ( key.sth for example) 来访问该kdb文件。客户端上的 java 等效项是您指定 jks 密码。

于 2019-05-30T13:25:31.530 回答
0

经过一段时间的工作,我能够解决这个问题。从一开始我就在应用程序端遇到了这个证书配置问题。即使在使用工具创建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 Clients )。

<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 进行通信。这个TLS CipherSpecs and CipherSuites in IBM MQ classes for JMS文档会很有帮助,因为 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忽略客户端用户凭据检查的值。在这些配置之后启用 SSL 时,IBM MQ 应该开始使用客户端应用程序。

感谢@JoshMc 对解决此问题的支持。

于 2019-06-25T03:39:16.640 回答