带有 TLS 的 Websphere MQ 的 Nifi JMS 输入

Nifi JMS input for Websphere MQ with TLS

我正在尝试使用 JMS 输入创建一个 nifi 流以连接到 Websphere MQ,运行 z/OS。如果队列管理器不受 TLS 保护,我可以使用 JNDI(使用 .bindings 文件)成功连接。当我切换到安全队列管理器时出现不支持的密码套件错误:

Caused by: com.ibm.mq.jmqi.JmqiException: CC=2;RC=2393;AMQ9771: SSL handshake failed. [1=java.lang.IllegalArgumentException[Unsupported ciphersuite SSL_RSA_WITH_AES_256_CBC_SHA256],3=10.24.98.154/10.24.98.154:457 (10.24.98.154),4=SSLSocket.createSocket,5=default]
    at com.ibm.mq.jmqi.remote.impl.RemoteTCPConnection.makeSocketSecure(RemoteTCPConnection.java:2093)
    at com.ibm.mq.jmqi.remote.impl.RemoteTCPConnection.connnectUsingLocalAddress(RemoteTCPConnection.java:870)
    at com.ibm.mq.jmqi.remote.impl.RemoteTCPConnection.protocolConnect(RemoteTCPConnection.java:1294)
    at com.ibm.mq.jmqi.remote.impl.RemoteConnection.connect(RemoteConnection.java:892)
    at com.ibm.mq.jmqi.remote.impl.RemoteConnectionSpecification.getSessionFromNewConnection(RemoteConnectionSpecification.java:416)
    at com.ibm.mq.jmqi.remote.impl.RemoteConnectionSpecification.getSession(RemoteConnectionSpecification.java:312)
    at com.ibm.mq.jmqi.remote.impl.RemoteConnectionPool.getSession(RemoteConnectionPool.java:146)
    at com.ibm.mq.jmqi.remote.api.RemoteFAP.jmqiConnect(RemoteFAP.java:1761)
    ... 40 common frames omitted
Caused by: java.lang.IllegalArgumentException: Unsupported ciphersuite SSL_RSA_WITH_AES_256_CBC_SHA256
    at sun.security.ssl.CipherSuite.valueOf(CipherSuite.java:228)
    at sun.security.ssl.CipherSuiteList.<init>(CipherSuiteList.java:79)
    at sun.security.ssl.SSLSocketImpl.setEnabledCipherSuites(SSLSocketImpl.java:2495)
    at com.ibm.mq.jmqi.remote.impl.RemoteTCPConnection.makeSocketSecure(RemoteTCPConnection.java:2084)
    ... 47 common frames omitted

我认为问题在于向 nifi 进程提供 -Dcom.ibm.mq.cfg.preferTLS=true 变量。我试图将它添加到 bootstrap.conf 但没有帮助。

是否有任何其他方法可以将 -Dcom.ibm.mq.cfg.preferTLS=true 变量提供给 ibm jms 客户端 jar?我真的坚持这个问题,所以任何帮助都会非常有益。谢谢

您遇到的问题是 IBM MQ 类 for JMS (com.ibm.mq.allclient.jar) 可以与 IBM Java JSSE 和非 IBM(例如:Oracle)一起使用 Java 日本证券交易所。两个 Java JSSE 实现的密码套件名称不同。对于大部分 Oracle 遵循 IETF 命名标准且密码套件前缀为 TLS_ 的部分,IBM 将其替换为 SSL_.


记录 IBM MQ SVRCONN 通道 CIPHERSPEC 名称如何映射到 IBM 和 Oracle Java JSSE 密码套件名称的 table 可以在 IBM 的知识中心找到: IBM MQ > Developing applications > Developing JMS and Java applications > Using IBM MQ classes for JMS > Writing IBM MQ classes for JMS applications > Accessing IBM MQ features from an IBM MQ classes for JMS application > Using TLS with IBM MQ classes for JMS > TLS CipherSpecs and CipherSuites in IBM MQ classes for JMS

例如,您提供的 CIPHERSPEC TLS_RSA_WITH_AES_256_CBC_SHA256 在 table 中有此条目。

CipherSpec                      |Equivalent CipherSuite (IBM JRE) |Equivalent CipherSuite (Oracle JRE) |Protocol |FIPS 140-2 compatible |
--------------------------------+---------------------------------+------------------------------------+---------+----------------------|
TLS_RSA_WITH_AES_256_CBC_SHA256 |SSL_RSA_WITH_AES_256_CBC_SHA256  |TLS_RSA_WITH_AES_256_CBC_SHA256     |TLS v1.2 |yes                   |

您 运行 分为两个问题:


首先,为了告诉 IBM MQ 类 for JMS 您希望它使用 Oracle 密码套件映射,您需要设置 Java 系统 属性 com.ibm.mq.cfg.useIBMCipherMappings 到值 false(注意默认值为 true)。

这可以在您的代码中完成:

System.setProperty("com.ibm.mq.cfg.useIBMCipherMappings", "false");

或在命令行上:

-Dcom.ibm.mq.cfg.useIBMCipherMappings=false

其次,当您使用 JMSAdmin 生成绑定文件时,默认情况下它会将您提供的密码套件名称 "convert" 转换为 IBM 密码套件名称。因此,当您指定 TLS_RSA_WITH_AES_256_CBC_SHA256 时,它会在生成的绑定文件中将其转换为 SSL_RSA_WITH_AES_256_CBC_SHA256

要解决此问题,您需要编辑 JMSAdmin 并查找如下一行:

$AMQJAVA -Dcom.ibm.msg.client.commonservices.log.outputName=$MQ_JAVA_DATA_PATH/log -Dcom.ibm.msg.client.commonservices.trace.outputName=$MQ_JAVA_DATA_PATH/trace -DMQ_JAVA_INSTALL_PATH=$MQ_JAVA_INSTALL_PATH com.ibm.mq.jms.admin.JMSAdmin $*

您需要将 -Dcom.ibm.mq.cfg.useIBMCipherMappings=false 添加到行中,如下所示:

$AMQJAVA -Dcom.ibm.mq.cfg.useIBMCipherMappings=false -Dcom.ibm.msg.client.commonservices.log.outputName=$MQ_JAVA_DATA_PATH/log -Dcom.ibm.msg.client.commonservices.trace.outputName=$MQ_JAVA_DATA_PATH/trace -DMQ_JAVA_INSTALL_PATH=$MQ_JAVA_INSTALL_PATH com.ibm.mq.jms.admin.JMSAdmin $*

解决第一个问题将允许 IBM MQ 类 for JMS 使用 Oracle 密码套件映射。

解决第二个问题将允许生成包含正确 Oracle 密码套件名称的绑定文件。


当前错误 returned 是 RC=2393,这意味着 MQRC_SSL_INITIALIZATION_ERROR,这是因为 IBM MQ 类 for Java 认为它应该使用 IBM 密码套件映射并将 SSL_RSA_WITH_AES_256_CBC_SHA256 密码套件名称发送到 Oracle Java,然后 returns 您收到的错误 Unsupported ciphersuite SSL_RSA_WITH_AES_256_CBC_SHA256,因为 Oracle Java 不知道同名的密码套件。

请注意,如果您只修复这两个问题中的一个,那么用于 JMS 的 IBM MQ 类 将 return RC=2400,这意味着 MQRC_UNSUPPORTED_CIPHER_SUITE 之前调用 Java JSSE。