【问题标题】:How to correct IBM MQ Error when SSL is enabled启用 SSL 时如何更正 IBM MQ 错误
【发布时间】:2017-06-10 17:26:56
【问题描述】:

我们已启用 SSL

  1. MQ 版本“7.1.0.7”
  2. 操作系统->'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 年 1 月 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 年 1 月 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 年 1 月 30 日)有其他问题:

仍然是同样的错误,但在我的客户端 java prg 已启用 System.setProperty("javax.net.debug", "all"); 以在执行客户端时查看所有活动。其打印TLS_RSA_WITH_AES_256_CBC_SHA256Ignoring 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_SHAECDHE_ECDSA_3DES_EDE_CBC_SHA256
SSL_ECDHE_RSA_WITH_NULL_SHAECDHE_RSA_NULL_SHA256

更新(2017 年 1 月 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 年 1 月 31 日 A)有其他问题:

由于 MQ 和客户端在同一台机器上运行,因此通过更改类路径获得了 Specification-Version: 7.1.0.7 jar
使用 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_SHA TLSv1 正确

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 年 2 月 1 日),增加了一些问题:

控制台中的完全异常

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

来自 AMKERR01.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 --------------------------------------------------------

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

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

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

在客户端,传递 key.jks 文件,该文件是在 MQ 级别使用“r​​unmqckm”创建的
是否需要为 TLSv2 指定不同的创建算法?

TLSV2 适用于 JDK8 和 ibm/java-x86_64-71

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

Oracle 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  

【问题讨论】:

    标签: java ssl ibm-mq


    【解决方案1】:

    2015 年 11 月 19 日发布的 IBM MQ Fix Pack 7.1.0.7 包括以下 APAR:

    IV73396: DEPRECATION OF SSLV3 CIPHERSPECS IN WEBSPHERE MQ V7 QUEUE MANAGERS

    问题描述:

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

    AES_SHA_US
    RC4_SHA_US
    RC4_MD5_US
    TRIPLE_DES_SHA_US
    DES_SHA_EXPORT1024
    RC4_56_SHA_EXPORT1024
    RC4_MD5_EXPORTRC2_MD5_EXPORT
    DES_SHA_EXPORT
    NULL_SHA
    NULL_MD5
    FIPS_WITH_DES_CBC_SHA
    FIPS_WITH_3DES_EDE_CBC_SHA

    尝试使用或配置这些 CipherSpec 之一将导致队列管理器错误日志中出现以下一条或多条消息:AMQ8242、AMQ9616、AMQ9635。


    这是 SSLv3 在 2015 年 6 月正式弃用的结果,因为 IETF 批准并发布了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 博客文章“SSL and TLS Cipher Specification Deprecations for the MQ Product”,其中详细介绍了各种修复包中不推荐使用的密码。


    我建议您找到一个支持的 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 -- HELP ME PLEASE!”,Tom Leend 于 2016 年 6 月 9 日发表。


    IBM MQ 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 目前没有宣布支持的结束日期。

    IBM developerWorks 博客文章“MQ Java, TLS Ciphers, Non-IBM JREs & 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 知识中心页面 Specifying CipherSpecs 进行比较,您会发现这三个都是 TLSv1.2 Cipherspecs。

    为了与 IBM JRE Ciphersuite 名称进行比较,v7.1 知识中心页面SSL CipherSpecs and CipherSuites in WebSphere MQ classes 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
    

    更新 (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 CipherSpec。

    我建议您尝试将 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
    

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

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

    请您确认每个 IBM MQ 产品的版本,您可以在 linux 上使用 unzip 实用程序执行此操作:

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

    输出将是:

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


    更新 (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 的支持。 p>


    您还注意到 jar 文件位于 /tmp/mqssl,请注意,在 MQ v8 之前,IBM 不支持将 jar 文件复制到默认安装位置之外。

    IBM 技术说明“Supported way to install WebSphere MQ Java jar files, JMS jar files, or C/C++ libraries”指出:

    +++ 第 1 节:MQ 7.x

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

    • WebSphere MQ 产品或
    • WebSphere MQ 客户端 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 技术说明“Supported way to install WebSphere MQ Java jar files, JMS jar files, or C/C++ libraries”还指出:

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

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

    可从 FixCentral here 获得仅限 MQ JMS 和 Java 的可再分发客户端客户端包。


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

    搜索您收到的错误后,我发现了这个 dW Answers 帖子“Why do I get AMQ9771, 2393 SSL Initialization error from a MQ Java/JMS application when trying to use an TLS AES 256 cipher?”。声明如下:

    在这种情况下,问题是由于尝试使用 AES 256 strong 密码算法。

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

    尝试使用 AES 256 密码时,例如 ECDHE_RSA_AES_256_CBC_SHA384 或 TLS_RSA_WITH_AES_256_CBC_SHA256 MQ Java/JMS 应用程序,你需要确保你的 JRE 支持这个 密码。在大多数情况下,当需要更强的密码算法时, 例如 AES 256 密码、JCE 无限强度管辖权 Policy Files 必须在 JDK/JRE 中获取并安装。

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

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

    上面的甲骨文网站链接指出:

    如果需要更强大的算法(例如,256 位的 AES 键),JCE Unlimited Strength Jurisdiction Policy Files 必须是 获取并安装在JDK/JRE中。

    用户有责任验证此操作是否正确 当地法规允许的。

    我建议您使用较低的 CipherSuite TLS_RSA_WITH_AES_128_CBC_SHA256,或按照上述建议获取并安装 JCE 无限强度管辖政策文件。 p>


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

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

    我在 google 上搜索了这个并找到了以下 dW Answers 帖子“How to resolve issue with MQ v7.x Java client getting SSL error NoSuchAlgorithmException: SHA224withRSA Signature not available?”,其中陈述了以下内容:

    假设使用 Oracle JVM:

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

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

    在上面的链接中,感兴趣的表格位于“The SunRsaSign Provider”下,其中列出了以下支持的签名算法:

    MD2withRSA
    MD5withRSA
    SHA1withRSA
    SHA256withRSA
    SHA384withRSA
    SHA512withRSA

    请注意,SHA224withRSA不在列表中。


    同样的 dW Answers 帖子继续说明:

    此签名算法在 IBM JVM 和 Oracle JVM 1.8。

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

    在上面的链接中,感兴趣的表格位于“The SunRsaSign Provider”下,其中列出了以下支持的签名算法:

    MD2withRSA
    MD5withRSA
    SHA1withRSA
    SHA224withRSA
    SHA256withRSA
    SHA384withRSA
    SHA512withRSA

    请注意SHA224withRSA列表中。


    来自 dW 帖子的建议:

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

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

    考虑到通过上述故障排除收集的所有信息,答案是无法使用 TLSv1.2 密码和 Oracle Java 小于 8 的 MQ v7.1.0.7 MQ Java 客户端。

    根据我提供的最后一篇 dW Answers 帖子,IBM 建议尝试使用 MQ v8,但我认为他们没有测试此配置,因此它也可能无法正常工作。

    如果您确实想尝试使用 MQ v8,我建议您使用最新的 v8.0.0.5 Java only redistributable client clients packages,我已经提供了链接。

    【讨论】:

      猜你喜欢
      • 2020-01-12
      • 1970-01-01
      • 1970-01-01
      • 2012-12-07
      • 2020-04-23
      • 2016-02-04
      • 2018-11-09
      • 2021-01-11
      • 1970-01-01
      相关资源
      最近更新 更多