使用匿名SSL连接到WebSphere MQ

时间:2012-09-18 10:31:27

标签: java ssl ibm-mq pcf

我在下面的代码中得到异常"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());
    }
Exception:
com.ibm.mq.MQException: MQJE001: Completion Code '2', Reason '2393'.
        at com.ibm.mq.MQManagedConnectionJ11.(MQManagedConnectionJ11.java:235)
        at com.ibm.mq.MQClientManagedConnectionFactoryJ11._createManagedConnection(MQClientManagedConnectionFactoryJ11.java:505)
        at com.ibm.mq.MQClientManagedConnectionFactoryJ11.createManagedConnection(MQClientManagedConnectionFactoryJ11.java:547)

1 个答案:

答案 0 :(得分:4)

为了满足您不验证客户端的要求,必须将频道设置为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 Ciphersuite。 (MD5已损坏,不应用于签署证书,SSL,TLS或其他任何内容。就此而言,SSL已被破坏,并且只能使用TLS密码,但这是另一个问题的讨论。)为此工作中,您需要设置MQEnvironment.sslFipsRequired=false或选择经过认证并列在最右侧列中的其中一个密码套件。

不知道您正在使用的版本,我建议将FIPS设置为false并在频道上使用NULL_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的其他可能原因包括文件权限,路径或文件名的拼写错误等。