2

您能帮帮我吗,我正在尝试通过 SSL 通道使用 PCFAgent 查找 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

编辑从评论中添加额外的澄清细节:

AMQERR01.LOGMQ Admin在应用程序收到 2035 的同时发现了与 SYSTEM.DEFAULT.MODEL.QUEUE 相关的错误。

当我取消安全设置和密码套件时,相同的程序适用于非 SSL 通道。

4

2 回答 2

2

好吧,我看不到您在代码中设置 UserID 的位置。因此,您发送的是一个空白 UserID,如果通道的 MCAUSER 为空白,则表示由于旧的安全漏洞,它会变为“mqm”UserID。

对于 MQ v7.1 或更高版本,如果您在“系统”通道上,默认的 CHLAUTH 规则将阻止连接。或者对于 MQ v8.0 或更高版本,通道可能需要用户 ID 和密码。您需要查看事件队列或队列管理器日志以了解 RC 为 2035(未授权)的原因。

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)
                            };
于 2017-01-16T17:07:44.927 回答
1

该类PCFAgent为来自命令服务器的响应消息创建一个动态队列。默认情况下,使用的模型队列是SYSTEM.DEFAULT.MODEL.QUEUE. 用户需要对+get +dsp模型队列拥有 OAM 权限。

如果程序在连接到非 SSL 通道时有效,则连接必须解析为具有针对SYSTEM.DEFAULT.MODEL.QUEUE.

队列管理器中的错误AMQERR01.LOG将显示缺少权限的用户标识以及缺少的特定权限。

根据您使用的 MQ 客户端 jar 文件的版本,如果您未指定 UserID,MQ 客户端将发送空白 UserID 或运行 java 进程的 UserID。在队列管理器端,如果MCAUSER通道的属性为空白,那么如果接收到空白 UserID 或您的进程在其下运行的 UserID,它将继承 mqm。如果MCAUSER通道的属性不为空,则将用于权限的 UserID。

于 2017-01-19T00:26:37.527 回答