从 java 发送到 MQ 始终使用 IBM MQ 版本 6.0 的默认安装 mqm 用户标识

发布于 2024-09-24 13:01:43 字数 1108 浏览 8 评论 0原文

我们的代码在 weblogic 和 MQ 6.0 中运行。无论我使用默认的 createQueueConnection() 或 createQueueConnection("myuserid","mypassword") ,它似乎总是使用 userid mqm 。请参阅下面的代码。

当我从版本 6.0 连接到较旧的 mq 安装 5 时,似乎会抛出以下错误 javax.jms.JMSSecurityException: MQJMS2013: 使用默认 createQueueConnection()< 为 MQQueueManager 提供的安全身份验证无效 /code> 除非我发送一个空白的用户 ID/密码,如 createQueueConnection("","")

我怎样才能让 myuserid 被发送?

Hashtable properties = new Hashtable(2);
properties.put(Context.PROVIDER_URL,context);
properties.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory");

InitialContext ctx = new InitialContext(properties);
QueueConnectionFactory qcf = (QueueConnectionFactory) ctx.lookup("QCF");
QueueConnection qc = qcf.createQueueConnection();
javax.jms.Queue q = (javax.jms.Queue) ctx.lookup("MYQUEUE");
QueueSession qs = qc.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
TextMessage tm = qs.createTextMessage();
tm.setText(outString);
QueueSender sender = qs.createSender(q);
sender.send(tm);
sender.close();
qs.close();
qc.close();

Our code runs in weblogic and we MQ 6.0. No matter if I use the default createQueueConnection() or createQueueConnection("myuserid","mypassword") it always seems to use userid mqm. See code below.

When I connect from version 6.0 to an older mq installion 5 it seems to throw the following error javax.jms.JMSSecurityException: MQJMS2013: invalid security authentication supplied for MQQueueManager using the default createQueueConnection() unless I send a blank userid/password as in createQueueConnection("","")

How can I get myuserid to be send instead ?

Hashtable properties = new Hashtable(2);
properties.put(Context.PROVIDER_URL,context);
properties.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory");

InitialContext ctx = new InitialContext(properties);
QueueConnectionFactory qcf = (QueueConnectionFactory) ctx.lookup("QCF");
QueueConnection qc = qcf.createQueueConnection();
javax.jms.Queue q = (javax.jms.Queue) ctx.lookup("MYQUEUE");
QueueSession qs = qc.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
TextMessage tm = qs.createTextMessage();
tm.setText(outString);
QueueSender sender = qs.createSender(q);
sender.send(tm);
sender.close();
qs.close();
qc.close();

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

jJeQQOZ5 2024-10-01 13:01:43

如果您在 createQueueConnection 中设置 ID,请放心,它将被呈现给队列管理器。您看到的问题是 QMgr 上的 SVRCONN 通道定义具有硬编码的值 MCAUSER('mqm')。这会覆盖客户端应用程序提供的任何值。

这里有几点需要注意。

  1. 尽管您可以发送 ID 和密码,但 WMQ 按面值接受这些内容。这些字段的存在是为了使凭证可用于可以验证它们的通道出口。如果没有这样的退出,通道只会以应用程序声称的任何 ID 运行,并且密码将被忽略。
  2. 出于上述原因,我总是告诉人们不要相信所提供的凭据,除非他们有这样的出口。管理员必须将适当的值编码到 MCAUSER 中。
  3. 管理 ID(UNIX 风格上的“mqm”)不是适当的值。它向连接到该通道的任何人授予管理权限。

有关此主题的更多信息以及 IMPACT 的 WMQ 安全演示和 WMQ 安全实验室指南的指针,请参阅 这个问题

If you are setting the ID in the createQueueConnection, rest assured, it is being presented to the queue manager. The problem you are seeing is that the SVRCONN channel definition on the QMgr has the value MCAUSER('mqm') hard coded. This overrides any value presented by the client app.

A couple of things to note here.

  1. Although you can send the ID and password, WMQ accepts these at face value. The fields exist to make the credentials available for a channel exit that can validate them. Without such an exit the channel just runs as whatever ID the app claims to be and the password is ignored.
  2. For the reason stated above, I always tell people not to trust the credentials presented unless they have such an exit. The administrator must code the appropriate value into the MCAUSER.
  3. The administrative ID ('mqm' on UNIX flavors) is NOT the appropriate value. It confers administrative authority to anyone connecting on that channel.

For a LOT more on this topic and pointers to the WMQ security presentation and WMQ Security Lab guide from IMPACT, please see this SO question.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文