私の JMS クライアントは、JNDI を介して WMQ に接続します。使用される初期コンテキスト ファクトリは ですcom.ibm.mq.jms.context.WMQInitialContextFactory
。
現在、WMQ 側には というキュー マネージャがありますTestMgr
。このキュー マネージャーの下に、2 つのチャネルを作成しました。1 つはPLAIN.CHL
SSL 暗号仕様を指定しないもので、もう 1 つはSSL.CHL
を使用して SSL 暗号仕様を構成しRC4_MD5_US
、SSL 認証を使用するものOptional
です。
IBM 鍵管理ツールを使用して、キュー・マネージャー用の鍵ストアを作成しました。キー db のパスは[wmq_home]\qmgrs\TestMgr\ssl\key
.
channelPLAIN.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 プロバイダーは問題ないはずです。また、クライアント アプリでは、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
はnullなので、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 に変更すると、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 チャネルの作業で初期コンテキストを取得する方法を知りたいです。大変お待たせいたしました。あなたの更新は高く評価されます。
ありがとう