与WMQ 8的Java连接

时间:2017-04-03 21:03:50

标签: java ibm-mq

我正在尝试将现有的Java应用程序连接到WebSphere MQ 8.这在过去与其他版本的Java和WMQ一起工作,但是对于Java 8和WMQ8,这并不想工作。 我得到了:

handling exception: javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)
SEND TLSv1.2 ALERT:  fatal, description = handshake_failure
WRITE: TLSv1.2 Alert, length = 2
called closeSocket()
Exception in thread "main" com.ibm.mq.MQException: MQJE001: Completion Code '2', Reason '2397'.

我无法理解为什么会这样。我已经设置了各种javax.net.ssl参数。我使用适当的SSL_TRUSTSTORE&我创建的KEYSTORE。有一个SSL_CIPHERSUITE。

我已经尝试过(差不多)所有WMQ支持的CipherSuite;我正在整个列表中工作,设置和环境如下:

  1. JAVA SSL_CIPHERSUITE = SSL_RSA_WITH_AES_256_CBC_SHA
  2. WMQ频道SSL_CIPHERSUITE = TLS_RSA_WITH_AES_256_CBC_SHA
  3. MQ Client 7.0.0.1 - 我尝试过切换到MQ Client 8,没有任何改进
  4. IBM WebSphere MQ,版本:8.0.0.5
  5. 与客户端错误相对应的AMQERR01.log中没有任何内容
  6. Oracle Java 8(Java(TM)SE运行时环境(版本1.8.0_60-b27)) - 启用SSLv3(已更改jdk.tls.disabledAlgorithms = RC4,DH keySize< 768)
  7. 其他信息:

    • 客户(银行)正在使用MQ 7,所以我没有选择 他们正在使用QM的问题。但是我一直在用MQ 8进行本地测试,以检查这是否是问题的一部分。
    • 我尝试过:-Dcom.ibm.mq.cfg.useIBMCipherMappings = false
    • 使用Oracle的JCE无限强度管辖权政策文件。

2 个答案:

答案 0 :(得分:2)

MQ v7.0于2008年6月27日发布(Fix Pack 7.0.0.1与2009年1月20日相关),自2015年9月30日(超过1。5年)以来一直缺乏支持。根据我的回答,此版本的MQ不支持Oracle JRE上的TLS CipherSuite,而您可以更新到以后的Fix Pack,我强烈建议您转移到支持的MQ客户端版本。较新的MQ客户端版本可以连接到较旧的MQ队列管理器。您可以在以下链接下载仅Java安装的MQ 8.0或MQ 9.0 jar文件:

APAR IV66840添加了新功能,允许非IBM Java运行时环境的用户使用TLS CipherSuite。

对于v7.0,这包含在Fix Pack 7.0.1.13中(请注意,Fix Pack 7.0.1.14是此版本的最终版本)。

对于8.0,它包含在Fix Pack 8.0.0.2中。

注意:此APAR是客户端修复程序。

要启用此选项,您需要执行以下操作:

  

为非IBM运行时启用这些非默认映射   环境,以下Java系统属性:

     

com.ibm.mq.cfg.useIBMCipherMappings

     必须将

设置为值:

     

false

     

例如,可以使用JVM参数配置它:

     

-Dcom.ibm.mq.cfg.useIBMCipherMappings=false

然后,您需要为Oracle JRE指定CipherSuite为TLS_RSA_WITH_AES_256_CBC_SHA,请注意SSL_RSA_WITH_AES_256_CBC_SHA是IBM JRE CipherSuite名称。

完成上述操作后,您可能会遇到AMQ9771,2393 SSL初始化错误。

dW回答帖子“Why do I get AMQ9771, 2393 SSL Initialization error from a MQ Java/JMS application when trying to use an TLS AES 256 cipher?”。它声明如下:

  

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

     

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

     

尝试使用AES 256密码时,例如   ECDHE_RSA_AES_256_CBC_SHA384或TLS_RSA_WITH_AES_256_CBC_SHA256   MQ Java / JMS应用程序,您需要确保您的JRE支持此功能   密码。在大多数情况下,当需要更强的密码算法时,   例如AES 256密码,JCE 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中。

     

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

如果你确实得到了2393,请按照上面的建议获取并安装 JCE Unlimited Strength Jurisdiction Policy Files

答案 1 :(得分:0)

您是否阅读过本页: https://www.ibm.com/support/knowledgecenter/en/SSFKSJ_8.0.0/com.ibm.mq.dev.doc/q113220_.htm

您使用的是弃用的CipherSuite吗?