IBM MQ 调用失败,压缩码为"2"("MQCC_FAILED")原因为"2035"("MQRC_NOT_AUTHORIZED")



我很难连接到我机构的MQ v9。

MQ 团队向我提供了连接信息:-

String hostName = '...'
int port = ...
String queueManager = '...'
String channel = '...'
String userId = 'ABC123'
String password = '...'

给定以下代码...

JmsConnectionFactory cf = JmsFactoryFactory.
getInstance(WMQConstants.WMQ_PROVIDER).
createConnectionFactory()
cf.setStringProperty(WMQConstants.WMQ_HOST_NAME, hostName)
cf.setIntProperty(WMQConstants.WMQ_PORT, port)
cf.setStringProperty(WMQConstants.WMQ_CHANNEL, channel)
cf.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_CLIENT)
cf.setStringProperty(WMQConstants.WMQ_QUEUE_MANAGER, queueManager)
cf.setStringProperty(WMQConstants.USERID, userId)
cf.setStringProperty(WMQConstants.PASSWORD, password)
// tried with both `true` and `false`... same error
cf.setBooleanProperty(WMQConstants.USER_AUTHENTICATION_MQCSP, true)
Connection connection = cf.createConnection()
connection.start()
connection.close()

。我收到此错误:-

Exception in thread "main" com.ibm.msg.client.jms.DetailedJMSSecurityException: 
JMSWMQ2013: The security authentication was not valid 
that was supplied for queue manager '...' with connection 
mode 'Client' and host name '...'.
Please check if the supplied username and password 
are correct on the queue manager to which you are 
connecting.  
Caused by: com.ibm.mq.MQException: JMSCMQ0001: IBM 
MQ call failed with compcode '2' ('MQCC_FAILED') reason 
'2035' ('MQRC_NOT_AUTHORIZED').

MQ 团队告诉志是这样的:-

----- amqzfuca.c : 4527 -------------------------------------------------------
04/17/2019 10:32:20 AM - Process(10468.40757) User(...) Program(...)
Host(...) Installation(Installation1)
VRMF(9.1.0.1) QMgr(...)
Time(2019-04-17T15:32:20.542Z)
RemoteHost(...)
CommentInsert1(...)
CommentInsert2(...)
CommentInsert3(CLNTUSER(XYZ) ADDRESS(...))
AMQ9777E: Channel was blocked
EXPLANATION:
The inbound channel '...' was blocked from address '...' 
because the active values of the channel matched a record
configured with USERSRC(NOACCESS). The active values of the channel were
'CLNTUSER(XYZ) ADDRESS(...)'.

。它失败了,因为它使用了错误的凭据进行连接。

当我传入不同的凭证(用户标识:ABC123)时,MQ 日志会看到我用于登录计算机的用户标识(用户标识:XYZ)。

为什么我显式传入的凭据被省略了?我该如何解决这个问题?

我正在使用这个依赖项:

<dependency>
<groupId>com.ibm.mq</groupId>
<artifactId>com.ibm.mq.allclient</artifactId>
<version>9.1.2.0</version>
</dependency>

我没有使用 IBM JRE...更准确地说,我正在Mac上使用Oracle JDK 1.8,如果有帮助的话。

谢谢。

更新 2019-04-22

我现在能够从 MQ 团队获得更准确的日志,因为我同时尝试了太多事情。

如果我将USER_AUTHENTICATION_MQCSP设置为true,则我的机器的用户 ID (XYZ) 将被传入。

如果我USER_AUTHENTICATION_MQCSP设置为false,那么我现在收到不同的错误消息:-

04/22/2019 01:19:49 PM - Process(1147099.9759) User(...) Program(...)
Host(rofesb911a) Installation(Installation1)
VRMF(9.1.0.1) QMgr(...)
Time(2019-04-22T18:19:49.323Z)
RemoteHost(...)
CommentInsert1(wa03598)
CommentInsert2(REQUIRED)
CommentInsert3(MCAUSER(ABC123) CLNTUSER(ABC123) ADDRESS(...))
AMQ9790I: The failed authentication check was caused by a CHLAUTH record with
CHCKCLNT(REQUIRED).
EXPLANATION:
The user ID 'ABC123' and its password were checked because the inbound
connection matched a channel authentication record with CHCKCLNT(REQUIRED).
The active values of the channel were 'MCAUSER(ABC123) CLNTUSER(ABC123)
ADDRESS(...)'. The MATCH(RUNCHECK) mode of the DISPLAY CHLAUTH
MQSC command can be used to identify the relevant CHLAUTH record.

好消息是它看到了正确的用户ID(ABC123),但我被告知密码无效。我不认为这是密码问题,因为我能够使用相同的凭据访问其他受保护的 Web 服务。

您的 MQ 团队已经为您提供了要使用的凭证(即用户标识和密码),因此我假设他们已经在队列管理器上打开了用户标识和密码检查。

队列管理器未使用 ADOPTCTX(是)

ADOPTCTX(YES) 是队列管理器上的一个设置,它指示一旦验证用户标识和密码正确,用户标识(在您的情况下为"ABC123")应用于所有进一步的安全检查(例如,我是否可以使用此队列)。如果此设置为 NO,那么在密码验证完成后,它实际上将使用客户机登录的用户标识,该标识也会发送到队列管理器(在您的例子中为"XYZ")。队列管理器上似乎就是这种情况。

USER_AUTHENTICATION_MQCSP模式

实际上有两种方法可以将用户标识和密码从 Java 客户机应用程序发送到队列管理器。

  1. 第一个(几十年前)在 IBM MQ V8 之前使用,并使用了受限制的长度流(每个字段最多 12 个字符),该流最初是供 DOS SNA 客户端将两个字段发送到 QMgr 的。这种跨网络的流也是客户端登录用户标识发送到队列管理器的方式,因此只能发送一个。
  2. MQCSP 结构是 MQCSP 结构,它允许可变长度的用户标识和密码字段,它添加了在 MQ V6 中添加的较新的结构,它对 MQ V8 队列管理器中的本地密码检查更有用。这与发送客户机登录用户标识的网络流不同,因此两者都被发送到队列管理器。

当您将USER_AUTHENTICATION_MQCSP设置为 true 时,您告诉 Java 客户端使用第二种模式。这提供了被ADOPTCTX(NO)设置绊倒的机会。如果将其设置为 false,那么进入队列管理器的唯一用户标识是 ABC123(在您的示例中),并且可能会为您提供不同的、可能是成功的结果。

尝试将USER_AUTHENTICATION_MQCSP设置为 false 的应用程序,当它起作用时,建议您的 MQ 团队他们应该使用 ADOPTCTX(YES),这也是默认值,然后您可以切换回设置为 trueUSER_AUTHENTICATION_MQCSP

相关内容

最新更新