2

私の JMS クライアントは、JNDI を介して WMQ に接続します。使用される初期コンテキスト ファクトリは ですcom.ibm.mq.jms.context.WMQInitialContextFactory

現在、WMQ 側には というキュー マネージャがありますTestMgr。このキュー マネージャーの下に、2 つのチャネルを作成しました。1 つはPLAIN.CHLSSL 暗号仕様を指定しないもので、もう 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 チャネルの作業で初期コンテキストを取得する方法を知りたいです。大変お待たせいたしました。あなたの更新は高く評価されます。

ありがとう

4

1 に答える 1

1

私は本当にとても好きではありませんでしcom.ibm.mq.jms.context.WMQInitialContextFactoryた。管理対象オブジェクトをキューに格納します。connectionFactoryそのため、JMS に QMgr への接続方法を指示する を検索するには、まず QMgrに接続して JNDI 呼び出しを行う必要があります。したがって、SSL 接続をデバッグする前に、基礎となる JNDI プロバイダーが機能しているかどうかを知る必要があります。

MQ ベースの JNDI プロバイダーをスキップしてファイルシステムのみを使用する場合は、ここで Bobby Woolf の記事の更新版を参照してください。を続行する場合はcom.ibm.mq.jms.context.WMQInitialContextFactory、読み進めてください。ただし、より多くの構成情報を提供する準備をしておいてください。

JMSAdmin ツールを実行するとき、作成したオブジェクトを表示しますか? たとえば、これが私のJMSAdmin.batスクリプトの 1 つです。

# Connection Factory for Client mode
# Delete the Connection Factory if it exists
DELETE  CF(JMSDEMOCF)

# Define the Connection Factory
DEFINE  CF(JMSDEMOCF) +
        SYNCPOINTALLGETS(YES) +
        SSLCIPHERSUITE(NULL_SHA) +
        TRAN(client) +
        HOST(127.0.0.1) CHAN(SSL.SVRCONN) PORT(1414) +
        QMGR( )

# Display the resulting definition
DISPLAY CF(JMSDEMOCF)

これにより、オブジェクトが削除され (JMSAdmin には define with replace オプションがないため)、オブジェクトが定義されてから表示されます。実際に両方のオブジェクトが定義されていますか? 両方を接続してインタラクティブに表示できますか? 表示された内容で質問を更新できますか?

その場合、JNDI プロバイダーの構成は各サンプル プログラムでどのようになりますか? 2009 は、少なくとも QMgr への接続が行われていることを示しているため、接続が切断されているのがアプリなのか JNDI プロバイダーなのかを判断することが重要です。JNDI プロバイダーに使用している構成情報が必要であり、それが機能しているケースと失敗しているケースで同じであるかどうかを診断するには。そうでない場合、それらはどのように異なりますか?

問題の原因がアプリなのか JNDI プロバイダーなのかがわかれば (または、ファイルシステムの初期コンテキストなどの MQ 接続を必要としない別の JNDI プロバイダーに切り替えれば)、次のステップを決定できます。

上記のリンク先の記事には、ファイルシステム JNDI プロバイダーを使用するコードと管理対象オブジェクト スクリプトのサンプルが含まれています。上記で貼り付けたスクリプトが同じ QMgr 名を使用していることに気付くかもしれません。それは私が記事のその部分を書いたからです。同じサンプルを使用して SSL に切り替えたい場合はconnectionFactory、SSL チャネルを指すように を更新するだけで機能します。

私が変更したサンプルの他のビットは次のとおりです。

java -Djavax.net.debug=ssl  ^
     -Djavax.net.ssl.trustStore=key2.jks  ^
     -Djavax.net.ssl.keyStore=key2.jks ^
     -Djavax.net.ssl.keyStorePassword=????????  ^
     -Djavax.net.ssl.trustStorePassword=???????? ^
     -cp "%CLASSPATH%"  ^
      com.ibm.examples.JMSDemo -pub -topic JMSDEMOPubTopic %*

注:^行継続の Windows バージョンです。

次に、問題がある場合は、この SO answerで説明したデバッグ シナリオに従います。SSLCAUTH(OPTIONAL)チャンネルにある場合でも、アプリにはトラストストアが必要になることに注意してください。これは、アプリが独自の証明書を提示しない場合でも、アプリは常に QMgr の証明書を検証する必要があるためです。私の場合、使用してSSLCAUTH(REQUIRED)いたので、アプリにはキーストアとトラストストアの両方が必要でした。あなたの質問は、QMgr にキーストアがあることを述べていますが、アプリケーションに対して何をしたかは述べていません。

最後に、2009 では通常、QMgr エラー ログにエントリが生成されます。引き続き問題が発生する場合は、それらのログ エントリで質問を更新してください。


更新:
コメントに応えて、JMSAdmin ツールは WMQ パッケージの一部です。ただし、WMQ には、ファイルシステム コンテキストと LDAP コンテキストの jar が付属しています。はWMQInitialContextFactoryオプションで、SupportPac ME01として提供されます。JMSAdmin ツール (または JMSAdmin GUI または WMQ Explorer) で使用WMQInitialContextFactoryする場合、PROVIDER_URL をホスト、ポート、およびチャネルで構成する必要があります。例えば:

PROVIDER_URL: <Hostname>:<port>/<SVRCONN Channel Name>
192.168.66.23:1414/SSL.SVRCONN

投稿を再度確認したところ、の構成情報提供されていることがわかりましたWMQInitialContextFactory。JMSADmin.config ファイルを探していましたが、環境ハッシュ テーブルにあります。そして、そこが問題です。WMQInitialContextFactory 接続ファクトリの両方に SSL チャネルを使用しようとしています。これが、ルックアップが失敗する原因です。1つWMQInitialContextFactory目は、キューを調べて QCF などの管理対象オブジェクトを取得するために、QMgre への Java 接続を作成します。そのためには、ハンドシェイクをネゴシエートするために、チャネルが設定されている暗号スイートを知る必要があります。現在、暗号スイートが記録されている *唯一の * 場所は、QCF 定義にあります。

次の行を追加してみてください。

environment.put(MQEnvironment.sslCipherSuite, "SSL_RSA_WITH_RC4_128_MD5");

この Infocenter pageに従って、使用する暗号スイートをコンテキスト ファクトリ クラスに通知する必要があります。もちろん、トラスト ストア (およびチャネルがSSLCAUTH(RQUIRED)設定されている場合はキーストア) の場所も知る必要があるため、環境内でこれらの値を取得する必要があります。コマンドライン変数を使用するか、コードを使用してそれらを環境にロードしてみてください。-Djavax.net.ssl.trustStore=key2.jksとの両方が必要です-Djavax.net.ssl.trustStorePassword=????????

もう 1 つのオプションは、引き続きプレーンテキスト チャネルを に使用しWMQInitialContextFactory、SSL チャネルをアプリケーションに使用することです。非特権ユーザー ID の MCAUSER がプレーンテキスト チャネルにある場合、QMgr にのみ接続し、管理対象オブジェクトを含むキューにアクセスするように制限できます。これらの制限により、誰でもそのチャネルを使用して管理対象オブジェクトを読み取ることができますが、アプリケーション キューまたは管理キューを読み取ることはできません。

于 2012-04-20T20:17:43.923 に答える