簡體   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