1

"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());
    }
例外:
com.ibm.mq.MQException: MQJE001: 完了コード「2」、理由「2393」。
        com.ibm.mq.MQManagedConnectionJ11.(MQManagedConnectionJ11.java:235) で
        com.ibm.mq.MQClientManagedConnectionFactoryJ11._createManagedConnection(MQClientManagedConnectionFactoryJ11.java:505) で
        com.ibm.mq.MQClientManagedConnectionFactoryJ11.createManagedConnection(MQClientManagedConnectionFactoryJ11.java:547) で
4

1 に答える 1

5

クライアント側を認証しないという要件を満たすには、チャネルをに設定する必要がありますSSLCAUTH(OPTIONAL)。キューマネージャーには証明書が必要であり、クライアントにはQMgrの証明書の署名者チェーン(CA署名の場合)またはQMgrの証明書の公開鍵(自己署名の場合)を含むtrsuststoreが必要です。SSL / TLSを使用すると、サーバー側が常に認証され、サーバーでの個人証明書とクライアントがそれを検証する方法が必要になることに注意してください。また、クライアントとQMgrは、使用するプロトコルについて合意する必要があり、FIPSが必要な場合は、FIPS認定アルゴリズムの1つを使用する必要があります。

上記のコードには間違いなく間違っていることが1つあり、問題の二次的な原因として考えられるものがいくつかあります。以下で説明する構成を解決すると、二次的な問題の1つが発生する可能性があります。これらのどれが当てはまるかを確認するには、WMQクライアントとサーバーのバージョン、チャネル定義、JSSEのSSL設定、コマンドライン呼び出しなどを知る必要があります。

したがって、この場合、2393は、クライアント側がSSL/TLSセッションを初期化できないことを示しています。明らかな問題は、InfocenterページのSSL CipherSpecsとCipherSuitesによると、これら2つの設定は無効な組み合わせであるということです。

MQEnvironment.sslFipsRequired=true;
MQEnvironment.sslCipherSuite = "SSL_RSA_WITH_RC4_128_MD5";//RC4_MD5_US

現在使用しているWMQクライアントとサーバーのバージョンについては言及していなかったため、V7.0V7.1、およびV7.5のそのページへのリンクを次に示します。FIPS準拠をリストしている列には、MD5暗号スイートが含まれていないことに注意してください。(MD5は壊れており、証明書、SSL、TLSなどの署名には使用しないでください。さらに言えば、SSLは壊れており、今後はTLS暗号のみを使用する必要がありますが、これは別の質問の議論です。)作業するにMQEnvironment.sslFipsRequired=falseは、認定されて右端の列にリストされている暗号スイートの1つを設定または選択する必要があります。

使用しているバージョンがわからない場合は、他のすべての構成が機能していることを確認するまで、FIPSを設定し、チャネルとアプリでfalse使用することをお勧めします。この暗号スイートは、WMQのすべてのバージョンのすべてのプラットフォームで利用できます。これを使用してテストすると、他のすべての設定が正しいことが保証されます。動作するようになったら、サーバー側とクライアント側の両方で使用可能なTLSとSHAに基づくより強力な暗号スイートを選択します。NULL_SHASSL_RSA_WITH_NULL_SHA

そうは言っても、ここにあなたが遭遇するかもしれない他の可能な問題のいくつかがあります。

アプリがそのトラストストア、またはサーバー側を表すそのトラストストア内の証明書または署名者チェーンを見つけられない場合、2393を取得できます。これらをコマンドラインで渡すことができます。

java -Djavax.net.ssl.trustStore=key2.jks \
     -Djavax.net.ssl.trustStorePassword=passw0rd \
     -cp "%CLASSPATH%"  \
     com.ibm.examples.JMSDemo -pub -topic JMSDEMOPubTopic

キーストアとトラストストアの操作は、WMQ自体ではなく、JSSEプロバイダーによって処理されます。したがって、JSSEプロバイダーの構成に通常使用する方法はどれでも機能するはずです。上記のコマンドラインに加えて、たとえば、JavaEEサーバーのコンテナ管理設定が含まれる場合があります。

接続が証明書を提示しているサーバーまで到達し、トラストストアの署名者チェーンが間違っているか不完全な場合にも、エラーが発生する可能性があります(2393かどうかは思い出せません)。

2393のその他の考えられる原因には、ファイルのアクセス許可、パスまたはファイル名のスペルミスなどがあります。

于 2012-09-18T13:14:22.507 に答える