繁体   English   中英

启用S​​SL时如何更正IBM MQ错误

[英]How to correct IBM MQ Error when SSL is enabled

我们已启用SSL

  1. MQ版本'7.1.0.7'
  2. OS->'Linux 2.6.32-642.11.1.el6.x86_64'
  3. 两个月前的[aug-2016],并且在启用和禁用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'出现错误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.7 jars
通过更改类路径对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
--- Suite ---- 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/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 --------------------------------------------------------

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

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

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

在client中,传递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 Fix Pack 7.1.0.7包含以下APAR:

IV73396:在Web MQ MQ V7队列管理器中不再支持SSLV3 CIPHERSPECS

问题描述:

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

AES_SHA_US
RC4_SHA_US
RC4_MD5_US
TRIPLE_DES_SHA_US
DES_SHA_EXPORT1024
RC4_56_SHA_EXPORT1024
RC4_MD5_EXPORT
RC2_MD5_EXPORT
DES_SHA_EXPORT
NULL_SHA
NULL_MD5
FIPS_WITH_DES_CBC_SHA
FIPS_WITH_3DES_EDE_CBC_SHA

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


这是由于IETF批准和发布RFC7568于2015年6月正式弃用SSLv3

  1. 介绍

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

    SSLv3的前身(SSL版本2)不再被认为是足够安全的[ RFC6176 ]。 现在是SSLv3。


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


我建议您找到要使用的受支持的TLSv1.2密码,该密码与Java客户端和IBM MQ SVRCONN通道都兼容。 由于不推荐使用SSLv3,因此进行了许多更新,从而为使用IBM或Non-IBM JRE的Java客户端提供了更多的TLS密码。

关于IBM对Java客户端密码支持所做的更改的很好的文章是IBM developerWorks博客文章“ MQ Java,TLS密码,非IBM JRE和APAR IT06775,IV66840,IT09423,IT10837-帮助我! ”。 2016年9月9日,汤姆·莱恩德(Tom Leend)。


您对IBM MQ v6.0.2.12没问题的原因是,该版本已经超过四年(自2012年9月30日起)不再受支持,并且IBM不会发布服务终止版本的任何安全更新,例如适用于受支持的版本。


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

  • 20174月30日起 ,不到四个月的时间就不再支持MQ v7.1。
  • MQ v7.5自20184月30日起不再提供支持。
  • MQ v8.0和v9.0当前没有宣布终止支持日期。

IBM developerWorks博客文章“ MQ Java,TLS密码,非IBM JRE和APAR IT06775,IV66840,IT09423,IT10837-帮助我! ”指出,添加了useIBMCipherMappings设置的APAR IV66840已包含在7.1.0.7中,应允许在Oracle JRE中使用TLSv1.2 Cipherspecs。

APAR IV66840中的表具有以下信息:

此APAR已针对WebSphere MQ v7.1和v7.5启用了以下WebSphere MQ CipherSuite到CipherSpec的映射,其中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知识中心页面的“ 指定CipherSpecs”进行比较 ,则会发现所有这三个都是TLSv1.2 Cipherspecs。

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

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不是已在MQ v7.1下为非IBM JRE启用的APAR IV66840中列出的那些之一,仅在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/tmp/mqssl/com.ibm.mq.jmqi.jar:/tmp/mqssl/com.ibm.mq.jar

您是否可以确定每个版本都来自哪个版本的IBM MQ产品,您可以使用unzip实用程序在linux上执行此操作:

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

输出将是:

Implementation-Version: xxxx - 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的支持。


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

IBM Technote“ 安装WebSphere MQ Java jar文件,JMS jar文件或C / C ++库的支持方式 ”指出:

+++第1节:MQ 7.x

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

  • WebSphere MQ产品或
  • WebSphere MQ客户端支持包。

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

不要将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 Technote“ 安装WebSphere MQ Java jar文件,JMS jar文件或C / C ++库的支持方式 ”也指出:

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

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

可从此处的 FixCentral获得MQ JMS和仅Java可再发行客户端客户机软件包。


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

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

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

包括Oracle / Sun和IBM在内的大多数Java JRE均启用了“加密算法的导入限制”。 这限制了最大密钥大小以及某些算法。

尝试将AES 256密码(例如ECDHE_RSA_AES_256_CBC_SHA384或TLS_RSA_WITH_AES_256_CBC_SHA256)与MQ 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

上面到oracle站点的链接指出:

如果需要更强大的算法(例如,具有256位密钥的AES),则必须获取JCE无限强度管辖权策略文件并将其安装在JDK / JRE中。

用户有责任验证该操作是否符合当地法规。

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


更新(2017/02/01)解决其他问题

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

我在Google上进行了搜索,发现以下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 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

在上面的链接中,关注的表位于“ SunRsaSign Provider ”下,该列表列出了以下受支持的签名算法:

MD2withRSA
MD5withRSA
SHA1withRSA
SHA224withRSA
SHA256withRSA
SHA384withRSA
SHA512withRSA

需要注意的是SHA224withRSA列表中。


dW职位的建议:

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM