如何在启用 SSL 时更正 IBM MQ 错误



我们启用了SSL

  1. MQ 版本 '7.1.0.7'
  2. OS->'Linux 2.6.32-642.11.1.el6.x86_64'
  3. 两个月前 [2016 年 8 月],它在启用和禁用 SSL 模式下工作正常

Java 客户端使用

  1. jdk1.7.0_21
  2. 工作密码/套件 ->SSL_RSA_WITH_RC4_128_SHA <> RC4_SHA_US

当我尝试连接到 MQ v7.1.0.7 队列管理器时,应用程序抛出以下错误:

com.ibm.mq.MQException: MQJE001: Completion Code '2', Reason '2397'.
at com.ibm.mq.MQManagedConnectionJ11.<init>(MQManagedConnectionJ11.java:228)
at com.ibm.mq.MQClientManagedConnectionFactoryJ11._createManagedConnection(MQClientManagedConnectionFactoryJ11.java:553)
at com.ibm.mq.MQClientManagedConnectionFactoryJ11.createManagedConnection(MQClientManagedConnectionFactoryJ11.java:593)
at com.ibm.mq.StoredManagedConnection.<init>(StoredManagedConnection.java:95)
at com.ibm.mq.MQSimpleConnectionManager.allocateConnection(MQSimpleConnectionManager.java:198)
at com.ibm.mq.MQQueueManagerFactory.obtainBaseMQQueueManager(MQQueueManagerFactory.java:882)

在队列管理器错误日志AMQERR01.LOG我看到以下内容:

AMQ9616: The CipherSpec proposed is not enabled on the server.
EXPLANATION: The SSL or TLS subsystem at the server end of a channel
been configured in such a way that it has rejected the CipherSpec
proposed by an SSL or TLS client. This rejection occurred during the
secure socket handshake (i.e. it happened before the proposed
CipherSpec was compared with the CipherSpec in the server channel
definition). 

我们有一个MQ v6.0.2.12队列管理器,它可以正常工作。

有人可以提供帮助,以前工作的系统出了什么问题吗?

通过在 qm.ini 文件中添加以下行来解决

SSL:
AllowSSLV3=Y
AllowWeakCipherSpec=Y

更新 (2017/01/27) 还有其他问题:

TLSv1以下工作

  1. TLS_RSA_WITH_DES_CBC_SHA SSL_RSA_WITH_DES_CBC_SHA TLSv1 TRUE
  2. TLS_RSA_WITH_3DES_EDE_CBC_SHA SSL_RSA_WITH_3DES_EDE_CBC_SHA TLSv1 TRUE

使用 TLSv1.2失败

  1. TLS_RSA_WITH_RC4_128_SHA256 SSL_RSA_WITH_RC4_128_SHA TLSv1.2 FALSE

我尝试了以下设置:

  1. SSLContext sslContext = SSLContext.getInstance("TLSv1");
  2. -Dcom.ibm.mq.cfg.preferTLS=true
  3. -Dcom.ibm.mq.cfg.useIBMCipherMappings=false

错误com.ibm.mq.MQException: MQJE001: Completion Code '2', Reason '2397'

AMQERR01.LOG

There is a mismatch between the CipherSpecs on the local and remote ends
of channel 'TEST.CH'. The channel will not run until this mismatch is 
resolved.The CipherSpec required in the local channel definition is 
'TLS_RSA_WITH_RC4_128_SHA256'. The name of the CipherSpec negotiated during
the SSL handshake is 'RC4_SHA_US'. A code is displayed if the name of the
negotiated CipherSpec cannot be determined

更新 (2017/01/29) 有其他问题:

  1. SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
  2. MQEnvironment.sslFipsRequired = true;
  3. MQEnvironment.sslCipherSuite ="SSL_RSA_WITH_AES_256_CBC_SHA256";
  4. ALTER CHANNEL(TEST.CH) CHLTYPE(SVRCONN) SSLCIPH(TLS_RSA_WITH_AES_256_CBC_SHA256)
  5. REFRESH SECURITY TYPE(SSL)
  6. 客户端执行/apps/java/jdk1.7.0_21/bin/java -Dcom.ibm.mq.cfg.preferTLS=true -Dcom.ibm.mq.cfg.useIBMCipherMappings=false -classpath .:/tmp/mqssl/com.ibm.mq.jmqi.jar:/tmp/mqssl/com.ibm.mq.jar:com.ibm.ws.webservices.thinclient_8.5.0.jar MQProducerSSL

将错误视为MQJE001: Completion Code '2', Reason '2400'MQRC_UNSUPPORTED_CIPHER_SUITE (2400)

更新 (2017/01/30) 还有其他问题:

仍然相同的错误,但是在我的客户端java prg中,System.setProperty("javax.net.debug", "all");可以在执行客户端时查看所有活动。其印刷TLS_RSA_WITH_AES_256_CBC_SHA256如下Ignoring unavailable cipher suite

Ignoring unavailable cipher suite: TLS_RSA_WITH_AES_256_CBC_SHA256

通话前

MQJE001: Completion Code '2', Reason '2400'.  
MQJE001: Completion Code '2', Reason '2400'.  

使用 IBM-JDK-71 进行测试 相同的异常
SSL_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA<><>ECDHE_ECDSA_3DES_EDE_CBC_SHA256
SSL_ECDHE_RSA_WITH_NULL_SHA<><>ECDHE_RSA_NULL_SHA256

更新 (2017/01/31) 有其他问题:

com.ibm.mq.jar

Specification-Version: 7.1.0.1  
Specification-Vendor: IBM Corporation  
Implementation-Title: WebSphere MQ classes for Java  
Implementation-Version: 7.1.0.1 - k710-001-120424  

com.ibm.mq.jmqi.jar

Specification-Version: 7.1.0.1  
Specification-Vendor: IBM Corporation  
Implementation-Title: WebSphere MQ Interface for Java  
Implementation-Version: 7.1.0.1 - k710-001-120424  

更新 (2017/01/31 A) 还有其他问题:

由于MQ和客户端在同一台机器上运行,因此规范版本:7.1.0.7jar
通过更改类路径在2 个场景中完成测试

  1. 没有-Dcom.ibm.mq.cfg.useIBMCipherMappings=false

jdk1.7.0_21/bin/java -Dcom.ibm.mq.cfg.preferTLS=true -classpath .:/opt/mqm/java/lib/com.ibm.mq.jmqi.jar:/opt/mqm/java/lib/com.ibm.mq.jar MQProducerSSL

有异常MQJE001: Completion Code '2', Reason '2400'

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

/apps/hostlink/java/jdk1.7.0_21/jdk1.7.0_21/bin/java -Dcom.ibm.mq.cfg.preferTLS=true -Dcom.ibm.mq.cfg.useIBMCipherMappings=true -classpath .:/opt/mqm/java/lib/com.ibm.mq.jmqi.jar:/opt/mqm/java/lib/com.ibm.mq.jar MQProducerSSL

有异常MQJE001: Completion Code '2', Reason '2393'

com.ibm.mq.MQException: MQJE001: Completion Code '2', Reason '2393'.  
at com.ibm.mq.MQManagedConnectionJ11.<init>(MQManagedConnectionJ11.java:232)  
at com.ibm.mq.MQClientManagedConnectionFactoryJ11._createManagedConnection(MQClientManagedConnectionFactoryJ11.java:553)  
at com.ibm.mq.MQClientManagedConnectionFactoryJ11.createManagedConnection(MQClientManagedConnectionFactoryJ11.java:593)  
at com.ibm.mq.StoredManagedConnection.<init>(StoredManagedConnection.java:96)  
at com.ibm.mq.MQSimpleConnectionManager.allocateConnection(MQSimpleConnectionManager.java:198)  
at com.ibm.mq.MQQueueManagerFactory.obtainBaseMQQueueManager(MQQueueManagerFactory.java:893)  
at com.ibm.mq.MQQueueManagerFactory.procure(MQQueueManagerFactory.java:780)  
at com.ibm.mq.MQQueueManagerFactory.constructQueueManager(MQQueueManagerFactory.java:729)  
at com.ibm.mq.MQQueueManagerFactory.createQueueManager(MQQueueManagerFactory.java:177)  
at com.ibm.mq.MQQueueManager.<init>(MQQueueManager.java:674)  
at MQProducerSSL.main(MQProducerSSL.java:89)  
Caused by: com.ibm.mq.jmqi.JmqiException: CC=2;RC=2393;AMQ9204: Connection to host 'localhost(2017)' rejected. [1=com.ibm.mq.jmqi.JmqiException[CC=2;RC=2393;AMQ9771: SSL handshake failed. [1=java.lang.IllegalArgumentException[Cannot support TLS_RSA_WITH_AES_256_CBC_SHA256 with currently installed providers],3=localhost/127.0.0.1:2017 (localhost),4=SSLSocket.createSocket,5=default]],3=localhost(2017),5=RemoteTCPConnection.makeSocketSecure]  

更新 (2017/01/31 B) 有其他问题:

MQEnvironment.sslFipsRequired = false;  
MQEnvironment.sslCipherSuite = "TLS_RSA_WITH_AES_128_CBC_SHA256";  
ALTER CHANNEL(TEST.CH) CHLTYPE(SVRCONN) SSLCIPH(TLS_RSA_WITH_AES_128_CBC_SHA256)  
/apps/hostlink/java/jdk1.7.0_21/jdk1.7.0_21/bin/java -Dcom.ibm.mq.cfg.preferTLS=true -Dcom.ibm.mq.cfg.useIBMCipherMappings=false -classpath .:/opt/mqm/java/lib/com.ibm.mq.jmqi.jar:/opt/mqm/java/lib/com.ibm.mq.jar MQProducerSSL

MQJE001:完成代码"2",原因"2397"。

MQJE001: Completion Code '2', Reason '2397'.
com.ibm.mq.MQException: MQJE001: Completion Code '2', Reason '2397'.
at com.ibm.mq.MQManagedConnectionJ11.<init>(MQManagedConnectionJ11.java:232)
at com.ibm.mq.MQClientManagedConnectionFactoryJ11._createManagedConnection(MQClientManagedConnectionFactoryJ11.java:553)
at com.ibm.mq.MQClientManagedConnectionFactoryJ11.createManagedConnection(MQClientManagedConnectionFactoryJ11.java:593)
at com.ibm.mq.StoredManagedConnection.<init>(StoredManagedConnection.java:96)
at com.ibm.mq.MQSimpleConnectionManager.allocateConnection(MQSimpleConnectionManager.java:198)
at com.ibm.mq.MQQueueManagerFactory.obtainBaseMQQueueManager(MQQueueManagerFactory.java:893)
at com.ibm.mq.MQQueueManagerFactory.procure(MQQueueManagerFactory.java:780)
at com.ibm.mq.MQQueueManagerFactory.constructQueueManager(MQQueueManagerFactory.java:729)
at com.ibm.mq.MQQueueManagerFactory.createQueueManager(MQQueueManagerFactory.java:177)
at com.ibm.mq.MQQueueManager.<init>(MQQueueManager.java:674)
at MQProducerSSL.main(MQProducerSSL.java:89)

在 TLSv1 以下工作

----规格----TLS_RSA_WITH_DES_CBC_SHA
---套房----SSL_RSA_WITH_DES_CBC_SHATLSv1 TRUE

Not working , when given below parameters , throwing **MQJE001: Completion Code '2', Reason '2400'** 
-Dcom.ibm.mq.cfg.useIBMCipherMappings=false  
-Dcom.ibm.mq.cfg.preferTLS=true

对TLSv1的疑问,如果TLSv1在没有上述参数的情况下工作,为什么需要为TLSv2提供-Dcom.ibm.mq.cfg.preferTLS=true?

即使 IBM-JDK 7.1 也 TLSv2 无法正常工作,可能出现什么问题?
需要试用 MQ8?

更新 (2017/02/01) 有其他问题:

控制台中的完全异常

MQJE001: Completion Code '2', Reason '2397'.
com.ibm.mq.MQException: MQJE001: Completion Code '2', Reason '2397'.
at com.ibm.mq.MQManagedConnectionJ11.<init>(MQManagedConnectionJ11.java:232)
at com.ibm.mq.MQClientManagedConnectionFactoryJ11._createManagedConnection(MQClientManagedConnectionFactoryJ11.java:553)
at com.ibm.mq.MQClientManagedConnectionFactoryJ11.createManagedConnection(MQClientManagedConnectionFactoryJ11.java:593)
at com.ibm.mq.StoredManagedConnection.<init>(StoredManagedConnection.java:96)
at com.ibm.mq.MQSimpleConnectionManager.allocateConnection(MQSimpleConnectionManager.java:198)
at com.ibm.mq.MQQueueManagerFactory.obtainBaseMQQueueManager(MQQueueManagerFactory.java:893)
at com.ibm.mq.MQQueueManagerFactory.procure(MQQueueManagerFactory.java:780)
at com.ibm.mq.MQQueueManagerFactory.constructQueueManager(MQQueueManagerFactory.java:729)
at com.ibm.mq.MQQueueManagerFactory.createQueueManager(MQQueueManagerFactory.java:177)
at com.ibm.mq.MQQueueManager.<init>(MQQueueManager.java:674)
at MQProducerSSL.main(MQProducerSSL.java:89)
Caused by: com.ibm.mq.jmqi.JmqiException: CC=2;RC=2397;AMQ9204: Connection to host 'localhost(2017)' rejected. [1=com.ibm.mq.jmqi.JmqiException[CC=2;RC=2397;AMQ9771: SSL handshake failed. [1=javax.net.ssl.SSLHandshakeException[Error signing certificate verify],3=localhost/127.0.0.1:2017 (localhost),4=SSLSocket.startHandshake,5=default]],3=localhost(2017),5=RemoteTCPConnection.protocolConnect]
at com.ibm.mq.jmqi.remote.api.RemoteFAP.jmqiConnect(RemoteFAP.java:2098)
at com.ibm.mq.jmqi.remote.api.RemoteFAP.jmqiConnect(RemoteFAP.java:1347)
at com.ibm.mq.MQSESSION.MQCONNX_j(MQSESSION.java:924)
at com.ibm.mq.MQManagedConnectionJ11.<init>(MQManagedConnectionJ11.java:221)
... 10 more
Caused by: com.ibm.mq.jmqi.JmqiException: CC=2;RC=2397;AMQ9771: SSL handshake failed. [1=javax.net.ssl.SSLHandshakeException[Error signing certificate verify],3=localhost/127.0.0.1:2017 (localhost),4=SSLSocket.startHandshake,5=default]
at com.ibm.mq.jmqi.remote.impl.RemoteTCPConnection.protocolConnect(RemoteTCPConnection.java:1310)
at com.ibm.mq.jmqi.remote.impl.RemoteConnection.connect(RemoteConnection.java:714)
at com.ibm.mq.jmqi.remote.impl.RemoteConnectionSpecification.getSessionFromNewConnection(RemoteConnectionSpecification.java:356)
at com.ibm.mq.jmqi.remote.impl.RemoteConnectionSpecification.getSession(RemoteConnectionSpecification.java:265)
at com.ibm.mq.jmqi.remote.impl.RemoteConnectionPool.getSession(RemoteConnectionPool.java:144)
at com.ibm.mq.jmqi.remote.api.RemoteFAP.jmqiConnect(RemoteFAP.java:1709)
... 13 more
Caused by: javax.net.ssl.SSLHandshakeException: Error signing certificate verify
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1886)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:276)
at sun.security.ssl.ClientHandshaker.serverHelloDone(ClientHandshaker.java:987)
at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:285)
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:868)
at sun.security.ssl.Handshaker.process_record(Handshaker.java:804)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1016)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1339)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1323)
at com.ibm.mq.jmqi.remote.impl.RemoteTCPConnection$6.run(RemoteTCPConnection.java:1280)
at com.ibm.mq.jmqi.remote.impl.RemoteTCPConnection$6.run(RemoteTCPConnection.java:1273)
at java.security.AccessController.doPrivileged(Native Method)
at com.ibm.mq.jmqi.remote.impl.RemoteTCPConnection.protocolConnect(RemoteTCPConnection.java:1271)
... 18 more
Caused by: java.security.NoSuchAlgorithmException: SHA224withRSA Signature not available
at java.security.Signature.getInstance(Signature.java:224)
at sun.security.ssl.JsseJce.getSignature(JsseJce.java:241)
at sun.security.ssl.HandshakeMessage$CertificateVerify.<init>(HandshakeMessage.java:1552)
at sun.security.ssl.ClientHandshaker.serverHelloDone(ClientHandshaker.java:982)
... 29 more

从AMQERR01。.LOG

----- amqrmrsa.c : 930 --------------------------------------------------------
01/31/2017 08:45:00 PM - Process(14444.328) User(mqm) Program(amqrmppa)
Host(testvm) Installation(Installation1)
VRMF(7.1.0.7) QMgr(TLSTEST.QM)
AMQ9665: SSL connection closed by remote end of channel '????'.
EXPLANATION:
The SSL or TLS connection was closed by the remote host 'localhost (127.0.0.1)'
during the secure socket handshake. The channel is '????'; in some cases its
name cannot be determined and so is shown as '????'. The channel did not start.
ACTION:
Check the remote end of the channel for SSL and TLS errors. Fix them and
restart the channel.
----- amqccisa.c : 6478 -------------------------------------------------------
01/31/2017 08:45:00 PM - Process(14444.328) User(mqm) Program(amqrmppa)
Host(testvm) Installation(Installation1)
VRMF(7.1.0.7) QMgr(TLSTEST.QM)
AMQ9492: The TCP/IP responder program encountered an error.
EXPLANATION:
The responder program was started but detected an error. 
The host name was 'localhost (127.0.0.1)'; in some cases the host name cannot
be determined and so is shown as '????'.
ACTION:
Look at previous error messages in the error files to determine the error
encountered by the responder program.
----- amqrmrsa.c : 930 --------------------------------------------------------

从类路径中删除了旧的 jar,但仍然是相同的异常

控制台输出为算法打印了以下行

matching alias: ibmwebspheremqtlstest.qm
*** Certificate chain
chain [0] = [
[
Version: V3
Signature Algorithm: SHA1withRSA, 

在客户端中,传递 key.jks 文件,该文件是在 MQ 级别用 'runmqckm'
创建的是否需要在为 TLSv2 创建时指定不同的算法?

TLSV2 与 JDK8 和 IBM/java-x86_64-71 一起工作

SSLContext sslContext = SSLContext.getInstance("TLSv1.2");

甲骨文JDK8

MQEnvironment.sslFipsRequired = false;  
MQEnvironment.sslCipherSuite = "TLS_RSA_WITH_AES_128_CBC_SHA256";  
ALTER CHANNEL(TEST.CH) CHLTYPE(SVRCONN) SSLCIPH(TLS_RSA_WITH_AES_128_CBC_SHA256)

IBM-JDK 7.1

MQEnvironment.sslFipsRequired = false;
MQEnvironment.sslCipherSuite = "SSL_RSA_WITH_NULL_SHA256";
ALTER CHANNEL(TEST.CH) CHLTYPE(SVRCONN) SSLCIPH(TLS_RSA_WITH_NULL_SHA256)

但是关于如何使用低于 8 的 Oracle java 版本使用任何 TLSv2 密码的问题?

要解决/解决此问题:将一一尝试

1) 使用 IBM JVM
2) 使用 Oracle Java v8 进行测试 3) 尝试 MQ v8

4) 其他选项来设置SSLCAUTH=OPTIONAL并且不需要客户端证书。

尝试使用 JDK8 和 MQ8

现在尝试对安装了JDK8 + MQ8,MQServer8和MQSeriesGSKit-8.0.0-4.x86_64做同样的事情,但现在使用runmqckm命令创建证书时出现问题

export LD_LIBRARY_PATH=/opt/mqm/gskit8/lib64  
export PATH=$PATH:/opt/mqm/gskit8/bin  
runmqckm  
bash: runmqckm: command not found  

部分使用 runmqakm
但无法创建 jks 文件,如下所示

runmqakm  -keydb -create  -db /var/mqm/qmgrs/TLSTEST!QM/ssl/key.jks  -pw password  -type jks  
CTGSK3017W The database type "jks" is not recognized.  

解决

无需设置以下路径

export LD_LIBRARY_PATH=/opt/mqm/gskit8/lib64  
export PATH=$PATH:/opt/mqm/gskit8/bin  

2015 年 11 月 19 日发布的 IBM MQ FP7.1.0.7 包括以下 APAR:

IV73396:弃用 WEBSPHERE MQ V7 队列管理器中的 SSLV3 密码规范

问题描述:

应用此更改后,创建的任何队列管理器将禁止在与队列管理器关联的通道定义上使用以下 CipherSpecs:


AES_SHA_USRC4_SHA_US
RC4_MD5_USTRIPLE_DES_SHA_US

DES_SHA_EXPORT1024
RC4_56_SHA_EXPORT1024
RC4_MD5_EXPORTRC2_MD5_EXPORT

DES_SHA_EXPORTNULL_SHA

NULL_MD5
FIPS_WITH_DES_CBC_SHAFIPS_WITH_3DES_EDE_CBC_SHA

尝试使用或配置其中一个 CipherSpecs 将导致队列管理器错误日志中出现以下一条或多条消息:AMQ8242、AMQ9616AMQ9635。


这是由于 IETF 批准并发布 SSLv3 于 2015 年 6 月正式弃用的结果RFC7568

  1. 介绍

自 1996 年发布以来,SSLv3 协议 [RFC6101] 在其密钥交换机制和它支持的加密方案上都受到了一系列攻击。 尽管在1999年被TLS 1.0 [RFC2246]取代,随后在2002年被TLS 1.1取代[RFC4346],在2006年被1.2取代[RFC5246],但这些替代版本的可用性并不普遍。 因此,TLS的许多实现都允许SSLv3的协商。

SSLv3的前身SSL版本2不再被认为足够安全[RFC6176]。 SSLv3 现在紧随其后。


Miguel A. Rodriguez 在 2016 年 5 月 19 日发表了一篇非常好的 IBM developerWorks 博客文章"MQ 产品的 SSL 和 TLS 密码规范弃用",详细介绍了在各种修订包中不推荐使用哪些密码。


我建议您找到一个受支持的 TLSv1.2 密码,该密码与 Java 客户机和 IBM MQ SVRCONN 通道兼容。 由于 SSLv3 被弃用,因此进行了许多更新,这些更新使用 IBM 或非 IBM JRE 向 Java 客户端开放了更多的 TLS 密码。

关于IBM对Java客户端密码支持所做的更改,一篇很好的文章是IBM developerWorks博客文章"MQ Java,TLS Ciphers,Non-IBM JREs和APARs IT06775,IV66840,IT09423,IT10837 - 请帮助我!",由Tom Leend于2016年6月9日发布。


IBMMQ v6.0.2.12 没有问题的原因是,该版本已停止支持四年多(自 2012 年 9 月 30 日起),并且 IBM 不会像发布受支持版本那样为服务终止版本发布任何安全更新。


我建议您迁移到受支持的 IBM MQ 版本。 在考虑升级到哪个版本时,请注意,当前支持的两个版本将在未来 16 个月内停止支持:

  • MQ v7.1 在不到四个月的时间里于2017 年 4 月 30 日停止支持。
  • MQ v7.5 将于2018 年 4 月 30 日停止支持。
  • MQ v8.0 和 v9.0 目前尚未宣布终止支持日期。

IBMdeveloperWorks 博客文章"MQ Java, TLS Ciphers, Non-IBM JRE & APARs IT06775, IV66840, IT09423, IT10837 -- HELP ME PLEASE!" 指出添加了useIBMCipherMappings设置的 APAR IV66840包含在 7.1.0.7 中,这应该允许将 TLSv1.2 Cipherspecs 与 Oracle JRE 一起使用。

APAR IV66840中的表包含以下信息:

以下 WebSphere MQ CipherSuite 到 CipherSpec 的映射具有 由此 APAR 为 WebSphere MQ v7.1 和 v7.5 启用,其中 Java 类和 JMS 类支持 SHA-2:

Oracle CipherSuite              IBM MQ CipherSpec
TLS_RSA_WITH_NULL_SHA256        TLS_RSA_WITH_NULL_SHA256
TLS_RSA_WITH_AES_128_CBC_SHA256 TLS_RSA_WITH_AES_128_CBC_SHA256
TLS_RSA_WITH_AES_256_CBC_SHA256 TLS_RSA_WITH_AES_256_CBC_SHA256

如果将其与 v7.1 知识中心页面指定密码规范进行比较,您会发现这三个都是 TLSv1.2 密码规范。

为了与 IBM JRE Ciphersuite 名称进行比较,v7.1 知识中心页面 SSL CipherSpecs and CipherSuites in WebSphere MQ class for Java 列出了类似的映射:

IBM CipherSuite                 IBM MQ CipherSpec
SSL_RSA_WITH_NULL_SHA256        TLS_RSA_WITH_NULL_SHA256
SSL_RSA_WITH_AES_256_CBC_SHA    TLS_RSA_WITH_AES_256_CBC_SHA
SSL_RSA_WITH_AES_256_CBC_SHA256 TLS_RSA_WITH_AES_256_CBC_SHA256

>UPDATE (2017/01/27) 以解决更多问题

MQ CipherSpec TLS_RSA_WITH_RC4_128_SHA256不是 APAR 中列出的IV66840 MQ v7.1 下为非 IBM JRE 启用的那些,它只列在 v8.0 下。 上面我列出了添加到MQ v7.1中的三个TLSv1.2密码规范。

我建议您尝试TLS_RSA_WITH_AES_256_CBC_SHA256作为MQ通道上的CipherSpec,TLS_RSA_WITH_AES_256_CBC_SHA256作为Java CipherSuite。

下面的设置应该适用于我建议的CipherSpec/CipherSuite,请注意,我将其从TLSv1更改为TLSv1.2

SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
-Dcom.ibm.mq.cfg.preferTLS=true
-Dcom.ibm.mq.cfg.useIBMCipherMappings=false

UPDATE (2017/01/30) 尝试解决更多问题

在您的问题中,您在类路径中提到了这些 jar 文件:/tmp/mqssl/com.ibm.mq.jmqi.jar:/tmp/mqssl/com.ibm.mq.jar

请您确认每个产品来自哪个版本的 IBM MQ 产品,您可以使用解压缩实用程序在 Linux 上执行此操作:

unzip -p com.ibm.mq.jar META-INF/MANIFEST.MF|grep Implementation-Version

输出将是:

Implementation-Version: x.x.x.x - pxxx-xxx-YYMMDD


UPDATE (2017/01/31) 以解决更多问题

包含-Dcom.ibm.mq.cfg.useIBMCipherMappings=false设置的 APAR IV66840直到 v7.1.0.7 才包含在 MQ 中,这是您所说的正在使用的版本。

根据您提供的输出,您引用的 jar 文件来自 v7.1.0.1 安装,该安装不包括对非 IBM JRE(如Oracle JRE)上的 TLS 的支持。


您还注意到 jar 文件在/tmp/mqssl中,请注意,在 MQ 的 v8 之前,IBM 不支持将 jar 文件复制到安装它们的缺省位置之外。

IBM 技术说明"安装 WebSphere MQ Java jar 文件、JMS jar 文件或 C/C++ 库的支持方法"指出:

+++ 第 1 部分:MQ 7.x

将 MQ jar 文件或 MQ C/C++ 库文件放到系统上的唯一受支持的方法是安装:

  • WebSphere MQ 产品或
  • WebSphere MQ Client SupportPacs。

要合法下载和使用客户端,您必须首先接受许可协议中指定的条款和条件。

不要将 WebSphere MQ jar 文件复制到应用程序 EAR 或 WAR 文件中。

不要从其他机器复制 WebSphere MQ jar 或 MQ C/C++ 库文件:

  • 修订包不能应用于从另一台机器复制 jar 或 C/C++ 库文件的"安装",这使得确保所有这些 jar/库文件彼此保持同步并且处于兼容级别变得更加困难。
  • 在计算机之间复制 jar/库文件还可能导致文件的多个副本驻留在同一台计算机上,这可能会导致处理代码和调试问题时出现问题。

如果您的应用程序与 MQ v7.1.0.7 队列管理器位于同一服务器上,那么您只需引用目录/opt/mqm/java/lib中的 jar 文件。

如果您的应用程序不在同一台服务器上,并且您计划继续使用 v7.1 或使用 v7.5,我建议您安装最新的完整客户端安装,请参阅我上面的注释,了解基于服务终止时间的版本建议。


如果您决定使用 v8 或 v9,IBM 技术说明"安装 WebSphere MQ Java jar 文件、JMS jar 文件或 C/C++ 库的支持方法"还指出:

b) 从 MQ 8.0.0.4 开始,您可以使用可再发行文件:

Linux 和 Windows 中 MQ 8.0
  • 和 9.0 的安装方案 - 第 8 章:您需要随应用程序重新分发 MQ 运行时库。
  • 如何下载适用于 Linux x86-64 和 Windows 64 的 MQ 8.0.0.4+ 和 MQ 9.0.0.x 可再发行客户端映像
  • 咬大小博客:MQ 8.0.0.4 可再发行客户端

这意味着使用 v8.0.0.4 及更高版本,您可以下载 MQ JMS 和仅限 Java 的可再发行组件客户端。

MQ JMS 和 Java 仅可再发行的客户机客户机包可从 FixCentral 获得。

>UPDATE (2017/01/31 A) 以解决更多问题

在搜索您收到的错误后,我发现了这个 dW Answers 帖子"为什么我在尝试使用 TLS AES 256 密码时从 MQ Java/JMS 应用程序收到 AMQ9771、2393 SSL 初始化错误? 它指出以下内容:

在这种情况下,问题是由尝试使用 AES 256 强引起的 密码算法。

大多数Java JRE,包括Oracle/Sun和IBM,都有导入限制 已启用加密算法。这限制了最大密钥大小 还有一些算法。

尝试使用 AES 256 密码时,例如 ECDHE_RSA_AES_256_CBC_SHA384或TLS_RSA_WITH_AES_256_CBC_SHA256MQ Java/JMS 应用程序,您需要确保您的 JRE 支持此功能 密码。在大多数情况下,当需要更强的密码算法时, 如AES 256密码,JCE无限强度管辖区 必须在 JDK/JRE 中获取并安装策略文件。

JDK/JRE 文档中对此进行了说明:对于 Oracle 1.7:

http://docs.oracle.com/javase/7/docs/technotes/guides/security/SunProviders.html

上面指向预言机站点的链接指出:

如果需要更强的算法(例如,具有 256 位的 AES 键),JCE 无限强度管辖政策文件必须是 在 JDK/JRE 中获取并安装。

用户有责任验证此操作是否为 根据当地法规允许。

我建议您使用较低的CipherSuiteTLS_RSA_WITH_AES_128_CBC_SHA256,或者按照上述建议获取并安装JCE无限强度管辖权策略文件


UPDATE (2017/02/01) 以解决更多问题

引起我注意的错误是Caused by: java.security.NoSuchAlgorithmException: SHA224withRSA Signature not available.

我在谷歌上搜索了这个,发现以下 dW Answers 帖子"如何解决 MQ v7.x Java 客户端收到 SSL 错误的问题 NoSuchAlgorithmException: SHA224withRSA 签名不可用?"其中指出以下内容:

假设使用 Oracle JVM:

我们发现问题的根本原因是签名 Oracle JRE 1.7 不支持算法 SHA224withRSA,请参阅 可用的签名算法:

https://docs.oracle.com/javase/7/docs/technotes/guides/security/SunProviders.html

在上面的链接中,感兴趣的表位于"SunRsaSign 提供程序"下,其中列出了以下支持的签名算法:


MD2withRSAMD5withRSA
SHA1withRSA
SHA256withRSASHA384withRSA

SHA512withRSA

请注意,SHA224withRSA不在列表中。


同一个dW Answers帖子继续指出:

此签名算法在 IBM JVM 和 甲骨文 JVM 1.8.

https://docs.oracle.com/javase/8/docs/technotes/guides/security/SunProviders.html

在上面的链接中,感兴趣的表位于"SunRsaSign 提供程序"下,其中列出了以下支持的签名算法:


MD2withRSAMD5withRSA
SHA1withRSASHA224withRSA

SHA256withRSASHA384withRSA

SHA512withRSA

请注意,SHA224withRSA列表中。


来自dW帖子的建议:

  1. 试用 Oracle Java 8 (1.8)
  2. 尝试使用 IBM Java

UPDATE (2017/02/01 B) 以解决更多问题

考虑到通过上述故障排除收集的所有信息,答案是,使用 MQ v7.1.0.7 MQ Java 客户机,不可能将 TLSv1.2 密码与 Oracle Java 小于 8 一起使用。

根据我提供的上一篇 dW Answers 帖子,IBM 建议尝试使用 MQ v8,但我认为他们没有测试过此配置,因此它也可能不起作用。

如果您确实想尝试使用 MQ v8,我建议您使用最新的 v8.0.0.5 仅限 Java 的可再发行客户端客户端包,我已经提供了链接。

最新更新