Java 使用匿名SSL连接到WebSphere MQ
我在下面的代码中得到异常Java 使用匿名SSL连接到WebSphere MQ,java,ssl,ibm-mq,pcf,Java,Ssl,Ibm Mq,Pcf,我在下面的代码中得到异常“com.ibm.mq.MQException:MQJE001:完成代码'2',原因'2393'。我的要求是使用SSL服务器连接通道连接QM不需要客户端身份验证 import com.ibm.mq.*; public class MQSeriesDataCollector implements CustomDCInf { public static void main (String [] args) { String qName="apm_qm"; MQ
“com.ibm.mq.MQException:MQJE001:完成代码'2',原因'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.\u createManagedConnection(MQClientManagedConnectionFactoryJ11.java:505)
位于com.ibm.mq.MQClientManagedConnectionFactoryJ11.createManagedConnection(MQClientManagedConnectionFactoryJ11.java:547)
要满足不验证客户端的要求,通道必须设置为
SSLCAUTH(可选)
。队列管理器必须具有证书,客户端必须具有包含QMgr证书的签名者链(如果是CA签名的)或QMgr证书的公钥(如果是自签名的)的trsuststore。请记住,使用SSL/TLS时,服务器端总是经过身份验证的,这需要服务器上的个人证书以及客户端对其进行验证的方法。此外,客户和QMgr必须就使用的协议达成一致,如果需要FIPS,他们必须使用FIPS认证的算法之一
上面发布的代码中有一点是绝对错误的,还有几点是问题的次要原因。一旦您解决了我将在下面描述的配置,您可能会遇到一个次要问题。为了确定哪一个适用,需要知道WMQ客户机和服务器的版本、通道定义、JSSE和/或命令行调用的SSL设置等
因此,在本例中,2393表示客户端无法初始化SSL/TLS会话。显而易见的问题是,根据信息中心页面SSL CipherSpecs和CipherSuite,这两种设置的组合无效:
MQEnvironment.sslFipsRequired=true;
MQEnvironment.sslCipherSuite = "SSL_RSA_WITH_RC4_128_MD5";//RC4_MD5_US
您没有提到您使用的是哪个版本的WMQ客户机和服务器,所以这里有一个指向该页面的链接,以及。请注意,列出FIPS合规性的列不包括任何MD5 Ciphersuite。(MD5已损坏,不应用于签署证书、SSL、TLS或其他任何内容。就此而言,SSL已损坏,今后只应使用TLS密码,但这是对另一个问题的讨论。)要使其正常工作,您需要设置MQEnvironment.sslFipsRequired=false
,或者选择一个经过认证并在最右列中列出的密码套件
由于不知道您正在使用的版本,我建议将FIPS设置为false
,并在频道上使用NULL\u SHA
,在应用程序上使用SSL\u RSA\u with\u NULL\u 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提供程序,都应该可以工作。除了如上所示的命令行之外,例如,它还可能包括JavaEE服务器中的容器管理设置
如果连接到达提供其证书的服务器,并且信任库具有错误或不完整的签名者链,则也可能会出现错误(我不记得是否为2393)
2393的其他可能原因包括文件权限、路径或文件名拼写错误等。要满足不验证客户端的要求,必须将通道设置为
SSLCAUTH(可选)
。队列管理器必须具有证书,客户端必须具有包含QMgr证书的签名者链(如果是CA签名的)或QMgr证书的公钥(如果是自签名的)的trsuststore。请记住,使用SSL/TLS时,服务器端总是经过身份验证的,这需要服务器上的个人证书以及客户端对其进行验证的方法。此外,客户和QMgr必须就使用的协议达成一致,如果需要FIPS,他们必须使用FIPS认证的算法之一
上面发布的代码中有一点是绝对错误的,还有几点是问题的次要原因。一旦您解决了我将在下面描述的配置,您可能会遇到一个次要问题。为了确定哪一个适用,需要知道WMQ客户机和服务器的版本、通道定义、JSSE和/或命令行调用的SSL设置等
因此,在本例中,2393表示客户端无法初始化SSL/TLS会话。显而易见的问题是,根据信息中心页面SSL CipherSpecs和CipherSuite,这两种设置的组合无效:
MQEnvironment.sslFipsRequired=true;
MQEnvironment.sslCipherSuite = "SSL_RSA_WITH_RC4_128_MD5";//RC4_MD5_US
您没有提到您使用的是哪个版本的WMQ客户机和服务器,所以这里有一个指向该页面的链接,以及。请注意,列出FIPS合规性的列不包括任何MD5 Ciphersuite。(MD5已损坏,不应用于签署证书、SSL、TLS或其他任何内容。就此而言,SSL已损坏,今后只应使用TLS密码,但这是对另一个问题的讨论。)要使其正常工作,您需要设置MQEnvironment.sslFipsRequired=false
,或者选择一个经过认证并在最右列中列出的密码套件
不是