【问题标题】:Nifi JMS input for Websphere MQ with TLS带有 TLS 的 Websphere MQ 的 Nifi JMS 输入
【发布时间】:2020-02-20 16:35:51
【问题描述】:

我正在尝试使用 JMS 输入创建一个 nifi 流,以连接到在 z/OS 上运行的 Websphere MQ。如果队列管理器不受 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

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

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

【问题讨论】:

  • 您运行的是什么 Java 提供程序和版本? jar 文件来自哪个版本的 IBM MQ?您指定的是什么密码套件? SVRCONN 上指定了什么 CIHERSPEC?
  • @JoshMc com.ibm.mq.allclient.jar -> 9.0.4.0 javax.jms-api.jar -> 2.0.1 java 版本 -> 我指定的 jdk1.8.0_161 密码套件 -> TLS_RSA_WITH_AES_256_CBC_SHA256
  • 该错误表明您指定了 SSL_RSA_WITH_AES_256_CBC_SHA256。您是否使用 JMSAdmin 创建了绑定文件?
  • @JoshMc 是的,我使用 JMSAdmin 创建了 .bindings 文件,如下所示:“DEF CF(SecureQMan) QMGR() HOSTNAME() PORT() CHANNEL( ) TRANSPORT(CLIENT) SSLCIPHERSUITE(TLS_RSA_WITH_AES_256_CBC_SHA256)"
  • edit 并使用您提供的其他详细信息更新您的问题,正如您从我的回答中看到的那样,这些是确定问题原因的关键。添加这些详细信息后,我会支持您的问题。

标签: jms ibm-mq apache-nifi tls1.2


【解决方案1】:

您遇到的问题是用于 JMS 的 IBM MQ 类 (com.ibm.mq.allclient.jar) 可以与 IBM Java JSSE 和非 IBM(例如:Oracle)Java JSSE 一起使用。两个 Java JSSE 实现之间的密码套件名称不同。大多数情况下,Oracle 遵循 IETF 命名标准并且密码套件的前缀是 TLS_,IBM 将其替换为 SSL_


记录 IBM MQ SVRCONN 通道 CIPHERSPEC 名称如何映射到 IBM 和 Oracle Java JSSE 密码套件名称的表格可以在 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 在表中有此条目。

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 Classes 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 生成绑定文件时,默认情况下它将采用您提供的密码套件名称并将其“转换”为 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 Classes for JMS 使用 Oracle 密码套件映射。

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


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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 2010-10-28
    • 2015-06-19
    • 2013-01-09
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多