1

"com.ibm.mq.MQException: MQJE001: Completion Code '2', Reason '2393'"我在下面的代码中遇到异常。我的要求是使用 SSL 服务器连接通道连接 QM。不需要客户端身份验证

import com.ibm.mq.*;
public class MQSeriesDataCollector implements CustomDCInf
{
public static void main (String [] args)
{
    String qName="apm_qm";
    MQEnvironment.hostname=args [0]; 
    MQEnvironment.channel=args [1]; 
    MQEnvironment.port=Integer.parseInt(args [2]);
    MQEnvironment.sslFipsRequired=true;
    MQEnvironment.sslCipherSuite = "SSL_RSA_WITH_RC4_128_MD5";//RC4_MD5_US
    MQQueueManager qMgr=null;
    try{
        qMgr = new MQQueueManager("apm_qm");
    }catch (MQException mqe){
        mqe.printStackTrace();
}
PCFMessageAgent agent=null;
StringBuffer output = new StringBuffer();
MQSeriesDataCollector mqTest=new MQSeriesDataCollector();
        try{
            agent = mqTest.getMQConnection(qMgr);
            output.append(mqTest.getQueueStats(agent));
        }
        catch(MQException mqe){
            System.out.println("Error:" + mqe.reasonCode + " Description:"+PCFConstants.lookupReasonCode (mqe.reasonCode));
            mqe.printStackTrace();
        }
        catch(NoClassDefFoundError ex){
            ex.printStackTrace();
        }
        catch (Exception e){            
             e.printStackTrace();           
        }
        finally{
            try{
                if(agent!=null){
                    agent.disconnect();
                }
            }            
            catch(Exception ex){                
                ex.printStackTrace();
            }
        }

        System.out.println(output.toString());
    }
例外:
com.ibm.mq.MQException:MQJE001:完成代码“2”,原因“2393”。
        在 com.ibm.mq.MQManagedConnectionJ11.(MQManagedConnectionJ11.java:235)
        在 com.ibm.mq.MQClientManagedConnectionFactoryJ11._createManagedConnection(MQClientManagedConnectionFactoryJ11.java:505)
        在 com.ibm.mq.MQClientManagedConnectionFactoryJ11.createManagedConnection(MQClientManagedConnectionFactoryJ11.java:547)
4

1 回答 1

5

为了满足您不验证客户端的要求,通道必须设置为SSLCAUTH(OPTIONAL)。队列管理器必须有一个证书,而客户端必须有一个 trsuststore,其中包含 QMgr 证书的签名者链(如果 CA 签名)或 QMgr 证书的公钥(如果自签名)。请记住,使用 SSL/TLS,服务器端总是经过身份验证,这需要服务器上的个人证书以及客户端验证它的方法。此外,客户端和 QMgr 必须就使用的协议达成一致,如果需要 FIPS,他们必须使用 FIPS 认证的算法之一。

上面发布的代码中有一件事肯定是错误的,还有几件事是导致问题的次要原因。一旦你解决了我将在下面描述的配置,你可能会遇到次要问题之一。要确定哪些适用,有必要知道 WMQ 客户端和服务器的版本、通道定义、JSSE 的 SSL 设置和/或命令行调用等。

所以在这种情况下,2393 表示客户端无法初始化 SSL/TLS 会话。明显的问题是,根据信息中心页面SSL CipherSpecs 和 CipherSuites,这两个设置是无效的组合:

MQEnvironment.sslFipsRequired=true;
MQEnvironment.sslCipherSuite = "SSL_RSA_WITH_RC4_128_MD5";//RC4_MD5_US

您没有提到您使用的是哪个版本的 WMQ 客户端和服务器,所以这里有一个指向V7.0V7.1V7.5的该页面的链接。请注意,列出 FIPS 合规性的列不包括任何 MD5 密码套件。(MD5 已损坏,不应用于签署证书、SSL、TLS 或其他任何东西。就此而言,SSL 已损坏,以后只能使用 TLS 密码,但这是另一个问题的讨论。)要得到这个工作时,您需要设置MQEnvironment.sslFipsRequired=false或选择经过认证并列在最右侧列中的密码套件之一。

不知道您正在使用的版本,我建议将 FIPS 设置为falseNULL_SHA在频道和SSL_RSA_WITH_NULL_SHA应用程序上使用,直到您确定所有其他配置都正常工作。此密码套件可在所有平台上的所有 WMQ 版本中使用。使用它来测试将确保所有其他设置都是正确的。一旦你让它工作,然后选择一个更强大的基于 TLS 和 SHA 的密码套件,它在服务器和客户端都可用。

也就是说,这里是您可能遇到的其他一些可能的问题。

当应用程序在代表服务器端的信任库中找不到其信任库或证书或签名者链时,您可以获得 2393。您可以在命令行中传递这些:

java -Djavax.net.ssl.trustStore=key2.jks \
     -Djavax.net.ssl.trustStorePassword=passw0rd \
     -cp "%CLASSPATH%"  \
     com.ibm.examples.JMSDemo -pub -topic JMSDEMOPubTopic

密钥库和信任库操作由 JSSE 提供程序处理,而不是由 WMQ 本身处理。因此,您通常用于配置 JSSE 提供程序的任何方法都应该有效。例如,除了上面显示的命令行之外,它还可能包括 Java EE 服务器中的容器管理设置。

如果连接到达提供其证书的服务器并且信任库具有错误或不完整的签名者链,您也可能会收到错误(我不记得它是否为 2393)。

2393 的其他可能原因包括文件权限、路径或文件名拼写错误等。

于 2012-09-18T13:14:22.507 回答