我"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());
}
Run Code Online (Sandbox Code Playgroud)
例外:
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)
为了满足您不对客户端进行身份验证的要求,必须将通道设置为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
Run Code Online (Sandbox Code Playgroud)
您没有提到您使用的是哪个版本的WMQ客户端和服务器,因此这里有指向该页面的V7.0,V7.1和V7.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
Run Code Online (Sandbox Code Playgroud)
密钥库和信任库操作由JSSE提供程序处理,而不是由WMQ本身处理。因此,通常使用哪种方法来配置JSSE提供程序都应该起作用。除了上面显示的命令行外,例如,它可能还包括Java EE服务器中容器管理的设置。
如果连接达到提供证书的服务器,并且信任库的签名者链错误或不完整,您也会收到错误消息(如果是2393,我将不记得了)。
2393的其他可能原因包括文件许可权,路径或文件名的拼写错误等。