【问题标题】:DetailedJMSSecurityException while trying to access queue in IBM MQ尝试访问 IBM MQ 中的队列时出现DetailedJMSSecurityException
【发布时间】:2015-01-05 19:03:12
【问题描述】:

这是我的问题。

我正在使用IBM MQ V7.1 的试用版。我创建了一个队列管理器MYQM,一个通道MY_SVRCONNMCA User Id abc。我已提供用户abc 访问MYQM。我正在尝试将消息放入队列Q1。但是在获得队列连接时,我遇到了异常。

com.ibm.msg.client.jms.DetailedJMSSecurityException: JMSWMQ2013: 为具有连接模式“客户端”和主机名“(1500)”的 QueueManager“MYQM”提供的安全认证无效。 请检查您所连接的 QueueManager 上提供的用户名和密码是否正确。

我使用下面的命令来允许用户 abc 访问MYQM

[mqm@localhost ~]$ setmqaut -m MYQM -t qmgr -p abc +connect
The setmqaut command completed successfully.

这是我的 Java 程序

 public class MqPut
 {
     public static void main(String[] args)
     {
      sendMsg("Sample Message");
     }
     public static void sendMsg(String msg)
     {
       MQQueueConnectionFactory connectionFactory = null;
       QueueConnection queueConn = null;
       QueueSession queueSession = null;
       QueueSender queueSender = null;
       TextMessage message = null;

       try
       {
         connectionFactory = new MQQueueConnectionFactory();
         connectionFactory.setHostName(<MQ SERVER IP>);
         connectionFactory.setPort(1500);
         connectionFactory.setTransportType(WMQConstants.WMQ_CLIENT_NONJMS_MQ);
         connectionFactory.setQueueManager("MYQM");
         connectionFactory.setChannel("MY_SVRCONN");   
         queueConn = connectionFactory.createQueueConnection("abc","password");
         queueSession = queueConn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
         queueSender = queueSession.createSender(queueSession.createQueue("Q"));   
         queueSender.setDeliveryMode(DeliveryMode.NON_PERSISTENT);   
         message = queueSession.createTextMessage(msg);
         queueSender.send(message);
         queueConn.close();
       }
       catch (Exception je)
       {
           je.printStackTrace();
       }
   }   
  }

我已尝试使用WebSphere 7, configuring JMS Q connection factory without user id: MQRC_NOT_AUTHORIZED,但我的问题仍然存在。我没有得到我做错了什么。任何帮助表示赞赏。

编辑

用户 abc 不属于 mqm 组

【问题讨论】:

    标签: java ibm-mq


    【解决方案1】:

    您是否为 svrconn 频道上的用户设置了 chlauth(频道身份验证)?从 MQ 7.1 开始,通道身份验证是新的。密码验证仅在 MQ 8 中可用。基本上,您需要在 qmgr svrconn 通道上允许来自客户端 IP 的远程连接。

    在 mqsc 控制台中尝试 SET CHLAUTH(MY_SVRCONN) TYPE(ADDRESSMAP) ADDRESS(客户端机器的ip) USERSRC(CHANNEL)

    如果这不起作用,请检查 qmgr 日志。它应该准确地说明导致 2035 年的原因。 在这里可以找到一个很好的技术说明http://www-01.ibm.com/support/docview.wss?uid=swg21577137 莫拉格真正有用的博客https://www.ibm.com/developerworks/community/blogs/aimsupport/entry/blocked_by_chlauth_why?lang=en

    【讨论】:

    • 感谢您的回复。执行以下更改后,我可以将消息放入队列中。将MCA User Id 设置为空并在我的程序中设置queueConn = connectionFactory.createQueueConnection(" ","password");。我会尝试你的建议。
    【解决方案2】:

    每当您从队列管理器收到任何错误时,请记住您应该始终查看队列管理器AMQERR01.LOG 以获得更详细的说明。对于任何与安全相关的错误尤其如此,因为只有一个错误代码 - MQRC_NOT_AUTHORIZED (2035) - 被转换为 JMS 异常 JMSWMQ2013 - 被返回给应用程序,以免向任何潜在黑客泄露详细信息。您必须始终查看队列管理器错误日志以了解详细信息。

    【讨论】:

    • 感谢您的指导。您的blog 消除了我的许多疑虑。再次感谢。
    【解决方案3】:

    在开发环境(WMQ 8.0)中,我更喜欢将授权修改为可选。

    ALTER AUTHINFO(SYSTEM.DEFAULT.AUTHINFO.IDPWOS) AUTHTYPE(IDPWOS) CHCKCLNT(OPTIONAL)
    REFRESH SECURITY TYPE(CONNAUTH)
    

    (出于安全考虑,不建议对生产队列管理器禁用此功能。)

    在 WMQ 7.1 中,可以将通道授权设置为禁用,但这似乎不适用于 WMQ 8.0

    ALTER QMGR CHLAUTH(DISABLED)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-03
      • 2016-08-19
      相关资源
      最近更新 更多