gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:56:44 25 4
gpt4 key购买 nike

我们已启用SSL


MQ版本'7.1.0.7'
OS->'Linux 2.6.32-642.11.1.el6.x86_64'
两个月前的[aug-2016],并且在启用和禁用SSL模式下都可以正常工作


Java客户端使用


jdk1.7.0_21
工作密码/套件-> 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以下工作


TLS_RSA_WITH_DES_CBC_SHA SSL_RSA_WITH_DES_CBC_SHA TLSv1 TRUE
TLS_RSA_WITH_3DES_EDE_CBC_SHA SSL_RSA_WITH_3DES_EDE_CBC_SHA TLSv1 TRUE


TLSv1.2失败


TLS_RSA_WITH_RC4_128_SHA256 SSL_RSA_WITH_RC4_128_SHA TLSv1.2 FALSE


我尝试了以下设置:


SSLContext sslContext = SSLContext.getInstance("TLSv1");
-Dcom.ibm.mq.cfg.preferTLS=true
-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)并附带其他问题:



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


MQJE001: Completion Code '2', Reason '2400'时出现错误
MQRC_UNSUPPORTED_CIPHER_SUITE (2400)


  更新(2017/01/30)并附带其他问题:


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

Ignoring unavailable cipher suite: TLS_RSA_WITH_AES_256_CBC_SHA256


通话前

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


经过IBM-JDK-71相同异常测试
SSL_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA <> <> ECDHE_ECDSA_3DES_EDE_CBC_SHA256
SSL_ECDHE_RSA_WITH_NULL_SHA <> <> ECDHE_RSA_NULL_SHA256


  更新(2017/01/31)并附加其他问题:


com.ibm.mq.jar

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


com.ibm.mq.jmqi.jar

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



  更新(2017/01/31 A)并附加其他问题:


由于MQ和客户端在同一台计算机上运行,​​因此获得了规范版本:7.1.0.7 jars
通过更改类路径对2种场景进行测试


没有 -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'


使用 -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/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: 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


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




2016年5月19日,Miguel A. Rodriguez发表了一篇非常不错的IBM developerWorks博客文章“ SSL and TLS Cipher Specification Deprecations for the MQ Product”,其中详细介绍了各种修订包中不赞成使用哪种密码。



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

关于IBM对Java客户端密码支持所做的更改的很好的文章是Tom Leend在2016年6月9日发布的IBM developerWorks博客文章“ MQ Java, TLS Ciphers, Non-IBM JREs & APARs IT06775, IV66840, IT09423, IT10837 -- HELP ME PLEASE!”。



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



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


从2017年4月30日起,不到四个月的时间就不再支持MQ v7.1。
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 Cipherspec。

为了与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不是已在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

您是否可以确定每个版本都来自哪个版本的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,这是您所声明的版本。

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



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

IBM Technote“ 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客户端支持包。
  
  
  要合法下载和使用客户端,您必须首先接受许可协议中指定的条款和条件。
  
  不要将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“ Supported way to install WebSphere MQ Java jar files, JMS jar files, or C/C++ libraries”还指出:


  b)从MQ 8.0.0.4开始,可以使用可再发行文件:
  
  
   Installation scenarios for MQ 8.0 and 9.0 in Linux and Windows-第8章:您需要使用应用程序重新分发MQ运行时库。
   How to download the MQ 8.0.0.4+ and MQ 9.0.0.x redistributable client images for Linux x86-64 and Windows 64-bit
   Bitesize Blogging: MQ 8.0.0.4 Redistributable Clients
  


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

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




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


搜索错误后,您收到的提示是“ daa Answers”。它指出以下内容:


  在这种情况下,此问题是由于尝试使用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:
  
   Why do I get AMQ9771, 2393 SSL Initialization error from a MQ Java/JMS application when trying to use an TLS AES 256 cipher?


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


  如果需要更强大的算法(例如,具有256位的AES
  键), http://docs.oracle.com/javase/7/docs/technotes/guides/security/SunProviders.html必须为
  获得并安装在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帖子“ JCE Unlimited Strength Jurisdiction Policy Files”指出以下内容:


  假设使用Oracle JVM:
  
  我们发现问题的根本原因是签名
  Oracle JRE 1.7不支持算法SHA224withRSA,请参阅
  可用的签名算法:
  
   How to resolve issue with MQ v7.x Java client getting SSL error NoSuchAlgorithmException: SHA224withRSA Signature not available?


在上面的链接中,关注的表位于“ https://docs.oracle.com/javase/7/docs/technotes/guides/security/SunProviders.html”下,其中列出了以下受支持的签名算法:


   MD2withRSA
    MD5withRSA
    SHA1withRSA
    SHA256withRSA
    SHA384withRSA
    SHA512withRSA


请注意, SHA224withRSA不在列表中。



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


  该签名算法在IBM JVM中以及在
  Oracle JVM 1.8。
  
   The SunRsaSign Provider


在上面的链接中,关注的表位于“ https://docs.oracle.com/javase/8/docs/technotes/guides/security/SunProviders.html”下,其中列出了以下受支持的签名算法:


   MD2withRSA
    MD5withRSA
    SHA1withRSA
    SHA224withRSA
    SHA256withRSA
    SHA384withRSA
    SHA512withRSA


请注意, SHA224withRSA在列表中。



dW职位的建议:


尝试使用Oracle Java 8(1.8)
尝试使用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仅可重新分发的客户端客户端软件包,该软件包已经提供了链接。

关于java - 启用S​​SL时如何更正IBM MQ错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41853178/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com