[英]Connecting to WebSphere MQ using anonymous SSL
我在下面的代码中收到异常"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)
为了满足您不对客户端进行身份验证的要求,必须将通道设置为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.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
密钥库和信任库操作由JSSE提供程序处理,而不是由WMQ本身处理。 因此,通常使用哪种方法来配置JSSE提供程序都应该起作用。 除了上面显示的命令行外,例如,它可能还包括Java EE服务器中容器管理的设置。
如果连接达到提供证书的服务器并且信任库的签名者链不正确或不完整,您也会收到错误消息(如果是2393,我将不记得了)。
2393的其他可能原因包括文件许可权,路径或文件名的拼写错误等。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.