Java IBM MQ8.0-AMQ9503通道协商失败

Java IBM MQ8.0-AMQ9503通道协商失败,java,ssl-certificate,ibm-mq,Java,Ssl Certificate,Ibm Mq,当在客户端通道(SVRCONN)启用SSL时,从Java客户端连接到IBM MQ8.0时出现问题。在通道上禁用SSL(SSLAUTH到可选)时,流工作正常 客户端是带有JRE1.7的java。MQ服务器版本为IBM MQ8.0 创建自签名证书,并根据MQ设置引用正确交换 javax.net.debug=ssl选项在日志中提示证书交换和ssl握手成功 但当java客户端代码尝试获取MQManager对象时,会引发以下MQ异常 com.ibm.mq.MQException: MQJE001: Com

当在客户端通道(SVRCONN)启用SSL时,从Java客户端连接到IBM MQ8.0时出现问题。在通道上禁用SSL(SSLAUTH到可选)时,流工作正常

客户端是带有JRE1.7的java。MQ服务器版本为IBM MQ8.0

创建自签名证书,并根据MQ设置引用正确交换

javax.net.debug=ssl选项在日志中提示证书交换和ssl握手成功

但当java客户端代码尝试获取MQManager对象时,会引发以下MQ异常

com.ibm.mq.MQException: MQJE001: Completion code '2', reason '2059' ...

caused by: com.ibm.jmqi.JmqiException: CC=2;RC=2059;AMQ9204: Connection to host '1.2.3.4(1414)' rejected. [1=com.ibm.jmqi.JmqiException[CC=2;RC=2059;AMQ9503: Channel negotiation failed. [3=CHANNEL.SVRCONN.SSL]],3=1.2.3.4(1414), 5=RemoteConnection.analyseSegment] ...

caused by: com.ibm.jmqi.JmqiException: CC=2;RC=2059;AMQ9503: Channel negotiation failed. [3=CHANNEL.SVRCONN.SSL]
我已配置使用TLS_RSA_和_AES_256_CBC_SHA256作为客户端和MQ客户端通道(SVRCONN)中的密码规范。
尝试使用其他密码规范,如TLS_RSA_和_AES_128_CBC_SHA,错误保持不变


但在远程端,我只有java客户端,它使用MQ库连接到MQ服务器


无法从服务器获取数据,因此添加了SSL日志中最后2页的图像

上面已经给出了MQ服务器端日志。此外还有一个默认日志AMQ9999:到主机1.2.3.4的通道“??”异常结束。 使用重复记录相同的错误。没有找到任何其他日志


下面是MQ客户端代码片段

void connect2MQ()
{
    MQEnvironment.hostname=1.2.3.4
    MQEnvironment.port=1414
    MQEnvironment.channel=CLIENT.SVRCONN.SSL
    if(SSLEnabled.equals("Y") // It is set to 'Y' in main method
    {
        MQEnvironment.sslCipherSuit="TLS_RSA_WITH_AES_128_CBC_SHA";
        System.setProperty("javax.net.ssl.truststore","trustStoreCertFilePath");
        System.setProperty("javax.net.ssl.keyStore","keyStoreCertFilePath");
        System.setProperty("javax.net.ssl.trustStorePassword","Pass");
        System.setProperty("javax.net.ssl.keyStorePassword","Pass");
        System.setProperty("javax.net.ssl.trustStoreType","JKS");
        System.setProperty("javax.net.ssl.keyStoreType","JKS");
    }

    try {
        MQQueueManager qmgr = new MQQueueManager("QMGR.TEST.SSL"); // Exception is thrown from here
        ...
    }

您似乎遇到了APAR中描述的问题。这在8.0.0.5及更高版本的MQ类(用于Java)和MQ类(用于JMS客户机jar文件)中得到了修复,我建议迁移到8.0.0.7,这是最新的v8版本

错误消息不匹配,但使用
SSLCAUTH(可选)
和不使用
SSLCAUTH(必需)
的症状与您正在运行的没有修复程序的版本匹配


Tom Leend有一个IBM developerWorks MQdev博客,标题为“如果您的MQ级别不具备修复功能,那么该博客将介绍一种解决方法


我使用的是Oracle JRE1.7,您使用的是哪个特定版本的MQ v8 jar文件?您可以通过在任何
com.ibm.MQ*.jar
文件上运行以下命令来找到:
unzip-p com.ibm.MQ.jar META-INF/MANIFEST.MF | grep实现版本
。客户端:实现版本:8.0.0.4-p800-004-151017。在M中验证带有命令“dspmqver”的Q服务器,其结果版本为:8.0.0.4,级别为:p800-004-151017您是否使用
-Dcom.ibm.mq.cfg.useIBMCipherMappings=false
?请确认您检查版本的jar文件来自“但在远程端,我只有使用mq库的java客户端”“。我已启动版本升级。升级后我会检查并更新。谢谢你的帮助和努力。@Krishna事情进展如何?升级是否解决了您的问题?尚未升级。这是一个客户测试环境。我们正在等待MQ停机的时间窗口。我将更新。您不需要升级队列管理器,只需升级应用程序正在引用的客户端jar文件。使用v8,您可以在FixCentral上的
8.0.0.7-WS-mq-Install-Java-All
8.0.0.7-WS-MQC-Redist-Java
包中下载
com.ibm.mq.allclient.jar
,google MQC8用于下载链接。您也可以在您所在的版本中尝试变通代码。如果您使用的是8.0.0.4或更早版本以及Oracle Java,则应该这样做。
void connect2MQ()
{
    MQEnvironment.hostname=1.2.3.4
    MQEnvironment.port=1414
    MQEnvironment.channel=CLIENT.SVRCONN.SSL
    if(SSLEnabled.equals("Y") // It is set to 'Y' in main method
    {
        MQEnvironment.sslCipherSuit="TLS_RSA_WITH_AES_128_CBC_SHA";
        System.setProperty("javax.net.ssl.truststore","trustStoreCertFilePath");
        System.setProperty("javax.net.ssl.keyStore","keyStoreCertFilePath");
        System.setProperty("javax.net.ssl.trustStorePassword","Pass");
        System.setProperty("javax.net.ssl.keyStorePassword","Pass");
        System.setProperty("javax.net.ssl.trustStoreType","JKS");
        System.setProperty("javax.net.ssl.keyStoreType","JKS");
    }

    try {
        MQQueueManager qmgr = new MQQueueManager("QMGR.TEST.SSL"); // Exception is thrown from here
        ...
    }
---- Code Snippet Start ----
KeyStore keyStore = KeyStore.getInstance("JKS");
java.io.FileInputStream keyStoreInputStream = new java.io.FileInputStream("/home/tom/myKeyStore.jks");
keyStore.load (keyStoreInputStream, password_char_array);

KeyStore trustStore trustStore = KeyStore.getInstance ("JKS");
java.io.FileInputStream trustStoreInputStream = new java.io.FileInputStream("/home/tom/myTrustStore.jks");
trustStore.load (trustStoreInputStream, password_char_array);

keyStoreInputStream.close();
trustStoreInputStream.close();

KeyManagerFactory keyManagerFactory = 
  KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
TrustManagerFactory trustManagerFactory = 
  TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
keyManagerFactory.init(keyStore,password);
trustManagerFactory.init(trustStore);

SSLContext sslContext = SSLContext.getInstance("TLSv1"); 
sslContext.init(keyManagerFactory.getKeyManagers(), 
  trustManagerFactory.getTrustManagers(), 
  null);
SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); 

// classes for JMS
//myJmsConnectionFactory.setObjectProperty(
//  WMQConstants.WMQ_SSL_SOCKET_FACTORY, sslSocketFactory);

// classes for Java
MQEnvironment.sslSocketFactory = sslSocketFactory;
---- Code Snippet End ----