带有 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。
我正在尝试使用 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。