【问题标题】:WebSphere MQ windows-to-windows authentication with Java classes使用 Java 类的 WebSphere MQ 窗口到窗口身份验证
【发布时间】:2025-12-31 16:00:15
【问题描述】:

使用 WebSphere MQ 版本 6.x 从 Vista 工作站连接到 Windows Server 2003,客户端版本为 7.0.1.3。我可以编写一个非常简单的 .Net 程序来使用 AMQMDNET 接口连接到通道和队列管理器,但是当使用 Java 和 com.ibm.mq 类执行相同操作时,我得到一个 2537 通道不可用。线路跟踪显示 .Net 代码提供了用户 SID 和用户 ID,但 Java 调用的代码没有填写 SID。我怀疑我们的管理员已经使用频道上的属性 NTSIDsRequired 设置了频道(等待管理员回复)。

有人知道为什么 Java 接口默认不发送 SID 吗?我找不到用于强制执行此行为的参数。

埃德

【问题讨论】:

    标签: java .net windows-vista ibm-mq


    【解决方案1】:

    我怀疑我们的管理员设置了 与物业沟通 NTSIDsRequired在频道上...

    实际上,如果这是原因,则可能恰恰相反。使用默认配置,队列管理器将使用 SID(如果提供),否则将使用帐户名称的字符串表示。如果它使用字符串表示并且失败了,你会得到一个2035 Not Authorized 错误。另一方面,如果设置了NTSIDsRequired 并且在没有 SID 的情况下进行了连接尝试,那么 导致连接被拒绝。至少在 QMgr 端,预计会出现 2035 错误,但客户端完全有可能会看到 2537。

    请注意,NTSIDsRequired 不是频道设置。它确实适用于发出连接请求但行为在对象权限管理器 (OAM) 处起作用并且代表连接的客户端进行的每个 OAM 检查,包括OPEN、@987654329 @ 和 SUBSCRIBE。它完全在队列管理器端运行。

    如果通道有一个拒绝连接的出口,通常会看到 2537。例如,BlockIP2 exit 可以设置为在用户 ID 为空、包含管理帐户或源自未经授权的 IP 地址(因此得名)的情况下拒绝连接。或者,频道可能已达到其最大实例数或已停止,但这些都不符合您的描述。不过,通道退出是一种现实的可能性。

    两种可能性是 1) NTSIDsRequired is 设置并且 QMgr 拒绝连接,因为 SID 不存在;或 2) 通道出口拒绝连接。由于安全错误消息在客户端是有意稀疏的,因此诊断这些将需要查看队列管理器的错误日志或队列管理器服务器上的 Windows 事件日志中的消息。如果安装了出口,则可能还需要查看出口日志。如果这是由于NTSIDsRequired 并且在队列管理器上启用了授权事件,我希望也会生成一个授权事件。如果是由于退出或通道实例限制之一,则会有日志条目。

    编辑:
    再做一些研究,我发现an Infocenter page 指出始终传递 SID,并且不区分 Windows 客户端的类型。基于此,您看到的行为与记录的行为相反,因此您应该能够在其上打开 PMR。该页面似乎是从the same page in the v6 Infocenter 逐字复制的,因此版本不匹配不会造成问题。

    【讨论】:

    • 是的,我们正在进行 V7 转换。客户端行为因 .Net 与 Java 而异,您不觉得奇怪吗?我希望基本 MQCONN 行为来自本机二进制文件,并且应该通过 SID。所有 MQ7 文档都说传递用户 ID 和 SID 是正常的 Windows 客户端行为 - 没有说 Java 是较小的客户端。我已经研究过真正的问题是否是调用操作系统失败以获取 SID,但到目前为止,我还没有找到任何在 Java 下获取 SID 失败的原因。
    • 在对信息中心进行了更多挖掘之后,我刚刚更新了我的回复。你是对的,行为应该是一致的,但我花了一段时间才找到一个说明这么多的页面(甚至那个页面也只是暗示它)。
    • 我确实追踪到通道出口正在拒绝。所以现在我必须追查为什么会发生这种情况(我有通道出口的来源,所以应该没问题)。可能是网络跟踪中没有返回 SID,因为我们没有到达提供 SID 的位置。在痕迹和代码之间,我应该能够弄清楚。感谢您的确认。