我的 JMS 客户端通过 JNDI 连接到 WMQ。使用的初始上下文工厂是com.ibm.mq.jms.context.WMQInitialContextFactory
.
目前,在 WMQ 端,有一个名为TestMgr
. 在这个队列管理器下,我创建了两个通道。一种是PLAIN.CHL
没有指定 SSL Cipher Spec,另一种是SSL.CHL
配置 SSL Cipher SpecRC4_MD5_US
和 SSL Authentication with Optional
。
我使用 IBM Key Management 工具为队列管理器创建了一个密钥库。密钥 db 的路径是[wmq_home]\qmgrs\TestMgr\ssl\key
.
对于 channel PLAIN.CHL
,我定义了一个队列连接工厂,例如:
DEF QCF(PlainQCF) QMANAGER(TestMgr) CHANNEL(PLAIN.CHL) HOST(192.168.66.23) PORT(1414) TRANSPORT(client)
在 SSL 通道下SSL.CHL
,我定义了一个队列连接工厂,如:
DEF QCF(SSLQCF) QMANAGER(TestMgr) CHANNEL(SSL.CHL) HOST(192.168.66.23) PORT(1414) TRANSPORT(client) SSLCIPHERSUITE(SSL_RSA_WITH_RC4_128_MD5)
现在我只能使用PlainQCF
. 但未能查找 SSL 队列连接工厂。我的代码如下所示:
Hashtable environment = new Hashtable();
environment.put(Context.INITIAL_CONTEXT_FACTORY, "com.ibm.mq.jms.context.WMQInitialContextFactory");
environment.put(Context.PROVIDER_URL, "192.168.66.23:1414/SSL.CHL");
Context ctx = new InitialContext( environment );
QueueConnectionFactory qcf = (QueueConnectionFactory) ctx.lookup("SSLQCF");
qcf.createConnection();
....
查找 SSL 工厂时是否缺少一些上下文属性?连接然后我发现代码在网上挂new InitialContext( environment )
了很长时间,快5分钟了,我得到了CC=2;RC=2009;AMQ9208...
错误。
任何建议将不胜感激。JNDI无法连接SSL通道是真的吗?
@T.Rob,非常感谢您的回复。但是我们仍然想使用WMQInitialContextFactory
,所以恐怕我仍然需要为此找到解决方案。
我刚刚定义了一次连接工厂。SSL 队列连接工厂的显示信息如下:
InitCtx> DISPLAY QCF(SSLQCF)
ASYNCEXCEPTION(ALL)
CCSID(819)
CHANNEL(SSL.CHL)
CLIENTRECONNECTOPTIONS(ASDEF)
CLIENTRECONNECTTIMEOUT(1800)
COMPHDR(NONE )
COMPMSG(NONE )
CONNECTIONNAMELIST(192.168.66.23(1414))
CONNOPT(STANDARD)
FAILIFQUIESCE(YES)
HOSTNAME(192.168.66.23)
LOCALADDRESS()
MAPNAMESTYLE(STANDARD)
MSGBATCHSZ(10)
MSGRETENTION(YES)
POLLINGINT(5000)
PORT(1414)
PROVIDERVERSION(UNSPECIFIED)
QMANAGER(TestMgr)
RESCANINT(5000)
SENDCHECKCOUNT(0)
SHARECONVALLOWED(YES)
SSLCIPHERSUITE(SSL_RSA_WITH_RC4_128_MD5)
SSLFIPSREQUIRED(NO)
SSLRESETCOUNT(0)
SYNCPOINTALLGETS(NO)
TARGCLIENTMATCHING(YES)
TEMPMODEL(SYSTEM.DEFAULT.MODEL.QUEUE)
TEMPQPREFIX()
TRANSPORT(CLIENT)
USECONNPOOLING(YES)
VERSION(7)
WILDCARDFORMAT(TOPIC_ONLY)
JNDI Provider 应该没问题,因为我可以成功查找普通连接工厂。此外,对于我的客户端应用程序,我从为 MQ 服务器创建的密钥库中提取了证书,并将其导入到我的 JRE 的信任库(cacerts)中,别名为ibmwebspheremqtestmgr
。
你是对的,有 2009 错误有一些日志条目:
=================================================================
4/20/2012 20:24:27 - Process(13768.3) User(MUSR_MQADMIN) Program(amqzmur0.exe)
Host(xxxx_host of my MQ) Installation(mqenv)
VRMF(7.1.0.0) QMgr(TestMgr)
AMQ6287: WebSphere MQ V7.1.0.0 (p000-L111019).
EXPLANATION:
WebSphere MQ system information:
Host Info :- Windows Server 2003, Build 3790: SP2 (MQ Windows 32-bit)
Installation :- C:\IBM\WebSphereMQ (mqenv)
Version :- 7.1.0.0 (p000-L111019)
ACTION:
None.
-------------------------------------------------------------------------------
4/20/2012 20:24:27 - Process(7348.116) User(MUSR_MQADMIN) Program(amqrmppa.exe)
Host(xxxx_host of my MQ) Installation(mqenv)
VRMF(7.1.0.0) QMgr(TestMgr)
AMQ9639: Remote channel 'SSL.CHL' did not specify a CipherSpec.
EXPLANATION:
Remote channel 'SSL.CHL' did not specify a CipherSpec when the local channel
expected one to be specified.
The remote host is 'xxx_host of my app (192.168.66.25)'.
The channel did not start.
ACTION:
Change the remote channel 'SSL.CHL' on host 'xxx_host of my app (192.168.66.25)' to
specify a CipherSpec so that both ends of the channel have matching
CipherSpecs.
----- amqcccxa.c : 3817 -------------------------------------------------------
4/20/2012 20:24:27 - Process(7348.116) User(MUSR_MQADMIN) Program(amqrmppa.exe)
Host(my app host) Installation(mqenv)
VRMF(7.1.0.0) QMgr(TestMgr)
AMQ9999: Channel 'SSL.CHL' to host 'xxx_host of my app (192.168.66.25)' ended
abnormally.
====================================================================
我也对错误日志有些困惑。我的应用程序在与我的 MQ 不同的机器上运行。但是日志显示Change the remote channel 'SSL.CHL' on host 'xxx_host of my app (192.168.66.25)' to
specify a CipherSpec so that both ends of the channel have matching
CipherSpecs.
如何更改我的应用程序主机上的通道密码规范?
MQEnvironment 的更新...
回复评论。
的值为MQEnvironment.sslCipherSuite
空,因此当我将它放入 env 哈希表时它会抛出 NullPointerExcetpion。但是我尝试了另一个environment.put(MQC.SSL_CIPHER_SUITE_PROPERTY, "SSL_RSA_WITH_RC4_128_MD5")
,但它仍然失败并2009
出现错误。
对于JMSAdmin
工具,我已将配置更改为使用WMQInitialContextFactory
. 像(JMSAdmin.config
)这样的配置:
INITIAL_CONTEXT_FACTORY=com.ibm.mq.jms.context.WMQInitialContextFactory
PROVIDER_URL=192.168.66.23:1414/SYSTEM.DEF.SVRCONN
其余配置保留为默认值。
请注意,这里我使用默认频道SYSTEM.DEF.SVRCONN
,以便我可以登录到管理控制台。如果我将频道更改为 SSL one SSL.CHL
,我也无法登录到管理控制台。这里发生的错误就像我的客户端应用程序中的错误一样。
TestMgr
另一个澄清,在我的客户端中,我使用跟随代码可以通过 channel 成功连接 qmgr( ) SSL.CHL
。
MQConnectionFactory factory = new MQConnectionFactory();
factory.setTransportType(JMSC.MQJMS_TP_CLIENT_MQ_TCPIP);
factory.setQueueManager("TestMgr");
factory.setSSLCipherSuite("SSL_RSA_WITH_RC4_128_MD5");
factory.setPort(1414);
factory.setHostName("192.168.66.23");
factory.setChannel("SSL.CHL");
MQConnection connection = (MQConnection) factory.createConnection();
现在问题就像你说的那样,那是初始上下文无法通过 SSL 通道连接到 qmgr。您提供的 option( use plain channel for initial context and ssl channel for connection factory
) 也有效。但我仍然想知道如何通过 ssl 通道工作获得初始上下文。非常感谢您的耐心。您的更新将不胜感激。
谢谢