2012-09-18 144 views
1

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

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) 

回答

4

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

在上面贴出的代码中有一件事情是绝对错误的,有几件事情是造成问题的次要原因。一旦你解决了我将在下面描述的配置,你可能会遇到其中一个次要问题。为了确定哪些适用,有必要知道WMQ客户端和服务器的哪个版本,通道定义,JSSE的SSL设置和/或命令行调用等。

因此,在这种情况下, 2393表示客户端无法初始化SSL/TLS会话。最明显的问题是,根据信息中心页SSL CipherSpecs和密码套件,这两个设置是一个无效组合:

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

你没有提到你在所以这里的这WMQ客户端和服务器的版本到该页面的链接V7.0,V7.1V7.5。请注意,列出符合FIPS的列不包含任何MD5密码套件。 (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的其他可能原因包括文件权限,路径或文件名的拼写错误等。

相关问题