启用S​​SL时出现MQ错误

时间:2017-01-25 13:42:26

标签: java 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.工作密码/套件 - &gt; 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 队列管理器,可以正常工作。

有人可以提供帮助系统出错的问题,这在以前有效吗?

Resolved by adding below lines in qm.ini file

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
  3. TLSv1.2

    失败
    1. TLS_RSA_WITH_RC4_128_SHA256 SSL_RSA_WITH_RC4_128_SHA TLSv1.2 FALSE
    2. 我试过这些设置:

      1. SSLContext sslContext = SSLContext.getInstance("TLSv1");
      2. -Dcom.ibm.mq.cfg.preferTLS=true
      3. -Dcom.ibm.mq.cfg.useIBMCipherMappings=false
      4. 错误为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(&#34; TLSv1.2&#34;);
        2. MQEnvironment.sslFipsRequired = true;
        3. MQEnvironment.sslCipherSuite =&#34; SSL_RSA_WITH_AES_256_CBC_SHA256&#34;;

          1. ALTER CHANNEL(TEST.CH)CHLTYPE(SVRCONN)SSLCIPH(TLS_RSA_WITH_AES_256_CBC_SHA256)
          2. REFRESH SECURITY TYPE(SSL)
        4. 6.Client执行 /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:完成代码&#39; 2&#39;,原因&#39; 2400&#39; MQRC_UNSUPPORTED_CIPHER_SUITE(2400)

            

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

          仍然是同样的错误,但在我的客户端java prg启用了 System.setProperty(&#34; javax.net.debug&#34;,&#34; all&#34;); 到执行客户端时查看所有活动。其打印 TLS_RSA_WITH_AES_256_CBC_SHA256 忽略不可用的密码套件,如下所示

          忽略不可用的密码套件:TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
          忽略不可用的密码套件:TLS_DHE_RSA_WITH_AES_256_CBC_SHA
          忽略不可用的密码套件:TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
          忽略不可用的密码套件:TLS_DHE_DSS_WITH_AES_256_CBC_SHA256
          忽略不可用的密码套件:TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
          忽略不可用的密码套件:TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
          忽略不可用的密码套件:TLS_ECDH_anon_WITH_AES_256_CBC_SHA
          忽略不可用的密码套件:TLS_DH_anon_WITH_AES_256_CBC_SHA
          忽略不可用的密码套件:TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
          忽略不可用的密码套件:TLS_DH_anon_WITH_AES_256_CBC_SHA256

          Ignoring unavailable cipher suite: TLS_RSA_WITH_AES_256_CBC_SHA256
          

          忽略不可用的密码套件:TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
          忽略不可用的密码套件:TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
          忽略不可用的密码套件:TLS_DHE_DSS_WITH_AES_256_CBC_SHA
          忽略不可用的密码套件:TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
          忽略不可用的密码套件:TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
          忽略不可用的密码套件:TLS_RSA_WITH_AES_256_CBC_SHA
          TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
          TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
          TLS_RSA_WITH_AES_128_CBC_SHA256
          TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
          TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
          TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
          TLS_DHE_DSS_WITH_AES_128_CBC_SHA256
          TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
          TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
          TLS_RSA_WITH_AES_128_CBC_SHA
          TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA

          致电前
          MQJE001:完成代码&#39; 2&#39;,原因&#39; 2400&#39;。
          MQJE001:完成代码&#39; 2&#39;,原因&#39; 2400&#39;。

          使用IBM-JDK-71测试相同异常
          SSL_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA&LT;&GT;&LT;&GT; ECDHE_ECDSA_3DES_EDE_CBC_SHA256
          SSL_ECDHE_RSA_WITH_NULL_SHA&lt;&gt;&lt;&gt; 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
          2. 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:完成代码&#39; 2&#39;,原因&#39; 2400&#39;

            1. 使用 -Dcom.ibm.mq.cfg.useIBMCipherMappings=false
            2. /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:完成代码&#39; 2&#39;,原因&#39; 2393&#39;

              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:完成代码&#39; 2&#39;,原因&#39; 2397&#39;

              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以下工作

              ---- Spec ---- TLS_RSA_WITH_DES_CBC_SHA
              ---套房---- SSL_RSA_WITH_DES_CBC_SHA TLSv1 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级别使用&#39; runmqckm&#39; 是否需要为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)
              

              但问题如何使用较低版本的Oracle java而不是8来处理任何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:找不到命令

              部分使用runmqakm
              但未能按以下方式创建jks文件 runmqakm -keydb -create -db /var/mqm/qmgrs/TLSTEST!QM/ssl/key.jks -pw password -type jks
              CTGSK3017W数据库类型&#34; jks&#34;不被承认。

              解决
              无需设置以下路径
              export LD_LIBRARY_PATH = / opt / mqm / gskit8 / lib64
              export PATH = $ PATH:/ opt / mqm / gskit8 / bin

              New Question on TLSv2 Ciphersuite
              

              TLSv2 with JDk8 Ciphersuites with MQ8?

1 个答案:

答案 0 :(得分:6)

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_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]和2006年[RFC5246]取代了TLS 1.1,但这些替代版本的可用性尚未普及。因此,许多TLS实现都允许SSLv3的协商。

         

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

  2.   

有一篇非常好的IBM developerWorks博客文章&#34; SSL and TLS Cipher Specification Deprecations for the MQ Product&#34;由Miguel A. Rodriguez于2016年5月19日发布,详细介绍了各种修订包中不推荐使用的密码。

我建议您找到一个支持的TLSv1.2密码,它与Java客户端和IBM MQ SVRCONN通道兼容。由于不推荐使用SSLv3,因此使用IBM或非IBM JRE向Java客户端开放了更多TLS密码,因此有许多更新。

关于IBM对Java客户端密码支持所做的更改的一篇很好的文章是IBM developerWorks博客文章&#34; MQ Java, TLS Ciphers, Non-IBM JREs & APARs IT06775, IV66840, IT09423, IT10837 -- HELP ME PLEASE!&#34;由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博客文章&#34; MQ Java, TLS Ciphers, Non-IBM JREs & APARs IT06775, IV66840, IT09423, IT10837 -- HELP ME PLEASE!&#34;声明添加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产品来自哪个版本,您可以使用unzip实用程序在linux上执行此操作:

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安装,包括对非JRE(如Oracle JRE)上的TLS的支持。

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

IBM Technote&#34; Supported way to install WebSphere MQ Java jar files, JMS jar files, or C/C++ libraries&#34;规定:

  

+++第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 ++库文件:

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

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

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

如果您决定使用v8或v9,那么IBM Technote&#34; Supported way to install WebSphere MQ Java jar files, JMS jar files, or C/C++ libraries&#34;还说:

  

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

     

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

可从FixCentral here获取MQ JMS和Java仅可再发行的客户端客户端软件包。

  

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

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

  

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

     

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

     

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

     

这在JDK / JRE文档中有说明:对于Oracle 1.7:

     

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

oracle网站上面的链接指出:

  

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

     

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

我建议您使用较低的CipherSuite TLS_RSA_WITH_AES_128_CBC_SHA256,或按照上面的建议获取并安装 JCE Unlimited Strength Jurisdiction Policy Files

  

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

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

我在谷歌搜索了这个,发现了以下dW答案帖子&#34; How to resolve issue with MQ v7.x Java client getting SSL error NoSuchAlgorithmException: SHA224withRSA Signature not available?&#34;其中陈述如下:

  

假设使用Oracle JVM:

     

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

     

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

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

  

MD2withRSA
   MD5withRSA
   SHA1withRSA
   SHA256withRSA
   SHA384withRSA
   SHA512withRSA

请注意,列表中的SHA224withRSA 不是

同样的dW答案帖子继续说明:

  

此签名算法可在IBM JVM中使用,也可在   Oracle JVM 1.8。

     

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

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

  

MD2withRSA
   MD5withRSA
   SHA1withRSA
   的 SHA224withRSA
   SHA256withRSA
   SHA384withRSA
   SHA512withRSA

请注意列表中的SHA224withRSA

dW帖子的建议:

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

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

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

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

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