2017-01-16 33 views
2

私はSSLチャネルを介してPCFAgentでibm mqの深さを調べようとしていますか教えてください。私はリモートでこのプログラムを実行しようとするとIBM MQの深さ

Security.setProperty("ssl.SocketFactory.provider", "com.ibm.jsse2.SSLSocketFactoryImpl"); 
    Security.setProperty("ssl.ServerSocketFactory.provider", "com.ibm.jsse2.SSLServerSocketFactoryImpl"); 
    System.setProperty("javax.net.ssl.trustStore","abc-dev.jks"); 
    System.setProperty("javax.net.ssl.trustStorePassword","abcdabcd"); 

    System.setProperty("javax.net.ssl.keyStore", "abc-dev.jks"); 
    System.setProperty("javax.net.ssl.keyStorePassword", "abcdabcd"); 

    MQEnvironment.sslCipherSuite = "TLS_RSA_WITH_AES_128_CBC_SHA"; 



    int attrs[] = { 2016, 3 }; 
    System.out.println("parameter creation"); 
    PCFParameter parameters[] = { new MQCFST(2016, "*"), new MQCFIN(20, 1), 
      new MQCFIL(1002, attrs) }; 
    String name = null; 
    Integer depth = null; 
    System.out.println("parameter creation end"); 



    try { 
     PCFAgent agent; 
     if (args.length == 1) { 
      System.out.print("Connecting to local queue manager " + args[0] 
        + "... "); 
      agent = new PCFAgent(args[0]); 
     } else { 
      System.out.print("Connecting to queue manager at " + args[0] 
        + ":" + args[1] + " over channel " + args[2] + "... "); 
      agent = new PCFAgent(args[0], Integer.parseInt(args[1]), 
        args[2]); 
     } 
     System.out.println("Connected."); 
     System.out.print("Sending PCF request... "); 
     com.ibm.mq.MQMessage responses[] = agent.send(13, parameters); 
     System.out.println("Received reply."); 
     for (int i = 0; i < responses.length; i++) { 
      MQCFH cfh = new MQCFH(responses[i]); 
      if (cfh.reason == 0) { 
       for (int j = 0; j < cfh.parameterCount; j++) { 
        PCFParameter p = PCFParameter 
          .nextParameter(responses[i]); 
        switch (p.getParameter()) { 
        case 2016: 
         name = (String) p.getValue(); 
         break; 

        case 3: // '\003' 
         depth = (Integer) p.getValue(); 
         break; 
        } 
       } 

       System.out.println("Queue " + name + " curdepth " + depth); 
      } else { 
       System.out.println("PCF error:\n" + cfh); 
       for (int j = 0; j < cfh.parameterCount; j++) 
        System.out.println(PCFParameter 
          .nextParameter(responses[0])); 

      } 
     } 

     System.out.print("Disconnecting... "); 
     agent.disconnect(); 
     System.out.println("Done."); 
    } catch (ArrayIndexOutOfBoundsException abe) { 
     System.out 
       .println("Usage: \n\tjava ListQueueDepth queue-manager\n\tjava ListQueueDepth host port channel"); 
    } catch (NumberFormatException nfe) { 
     System.out.println("Invalid port: " + args[1]); 
     System.out 
       .println("Usage: \n\tjava ListQueueDepth queue-manager\n\tjava ListQueueDepth host port channel"); 
    } catch (MQException mqe) { 
     System.err.println(mqe); 
    } catch (IOException ioe) { 
     System.err.println(ioe); 
    } 

、私は次の例外を取得しています:

com.ibm.mq.MQException:MQJE001:完了コード2、理由2035

編集コメントの詳細を明確に追加する:

MQ Adminがエラーを発見したのはAMQERR01.LOGは、アプリケーションが2035を受信すると同時にSYSTEM.DEFAULT.MODEL.QUEUEに関連します。

セキュリティ設定と暗号スイートをオフにすると、同じプログラムが非SSLチャネルで動作します。

答えて

2

まあ、コードでUserIDをどこに設定するのかわかりません。したがって、チャネルのMCAUSERが空白の場合、古いセキュリティホールのために 'mqm' UserIDになる空のUserIDを送信しています。

MQ v7.1以上の場合、デフォルトのCHLAUTHルールは、「SYSTEM」チャネル上にある場合に接続をブロックします。または、MQ v8.0以上の場合、チャネルにはユーザーIDとパスワードが必要な場合があります。 2035のRC(許可されていない)の理由から、イベント・キューまたはキュー・マネージャー・ログのいずれかを調べる必要があります。

int attrs[] = { 2016, 3 }; 
PCFParameter parameters[] = { new MQCFST(2016, "*"), 
           new MQCFIN(20, 1), 
           new MQCFIL(1002, attrs) }; 

また、ハードコードされた値はどうですか?他の人のプログラムを逆コンパイルしましたか?

なぜIBM MQの定義を使用していませんか?

int[] attrs = { 
       CMQC.MQCA_Q_NAME, 
       CMQC.MQIA_CURRENT_Q_DEPTH 
       }; 
PCFParameter[] parameters = { 
           new MQCFST (CMQC.MQCA_Q_NAME, "*"), 
           new MQCFIN (CMQC.MQIA_Q_TYPE, CMQC.MQQT_LOCAL), 
           new MQCFIL (CMQCFC.MQIACF_Q_ATTRS, attrs) 
          }; 
+0

私はユーザーIDとパスワードを設定する必要があるのはSSLチャネルのみですか?なぜなら私はセキュリティ設定と暗号スイートをはずすと、同じプログラムが非SSLチャンネルで動作するからです。 SSLチャネルである場合は、ここで設定する必要があるUserIDとパスワードを教えてください。 – Prakash

+0

キュー・マネージャーAMQERR01には何が表示されますか。あなたのクライアントが2035レスポンスを受け取ったらログに記録しますか? – JoshMc

+0

こんにちは、私はそれらのログにアクセスできません。私が持っているものはすべて2035年のエラーです。 – Prakash

1

PCFAgentクラスは、コマンド・サーバーからの応答メッセージ用の動的キューを作成します。既定では、使用されるモデルキューはSYSTEM.DEFAULT.MODEL.QUEUEです。ユーザーはOAM許可+get +dspをモデル・キューに入れる必要があります。

非SSLチャネルに接続するときにプログラムが機能する場合、接続はSYSTEM.DEFAULT.MODEL.QUEUEに対して必要なOAM許可を持つ別のユーザーIDに解決されている必要があります。

キューマネージャのAMQERR01.LOGにエラーがあると、特定の権限が不足しているユーザーIDとその権限がありません。

使用しているMQクライアントjarファイルのバージョンに応じて、UserIDを指定しないと、MQクライアントはブランクのUserIDまたはJavaプロセスが実行されているUserIDを送信します。チャネルのMCAUSER属性がブランクの場合、キュー・マネージャー側では、空のユーザーIDが受信された場合はmqmを、またはプロセスが実行されている場合はUserIDが継承されます。チャネルのMCAUSER属性が、許可に使用されるUserIDである空白でない場合。

+0

お返事ありがとうございます。私はあなたがここで何を話しているのか知りたいですか?コード内にUserIdを渡しているためです。 – Prakash

+0

MQ AdminがAMQERR01.LOGで見つけたエントリで質問を更新してください。これには、アクセス権がないユーザーIDと存在しないアクセス許可の両方が表示されます。 'DIS CHL(CHL.NAME)MCAUSER'と' DIS CHLAUTH(CHL.NAME) 'の両方のsslとnon-sslチャンネルの表示コマンドを見ると便利です。あなたが適切であると感じたら、情報を消毒してください。追加の詳細に基づいて各チャンネルが解決するユーザー名についての詳細を回答に反映させることができます。 – JoshMc

+0

こんにちはジョシュ、管理者は、私はいくつかのセキュリティの問題のためにPCFメッセージを使用するはずではないと言います。キューの深さを見つけることができる他の方法はありますか? – Prakash

関連する問題