IBM MQ调用失败,compcode为'2'('MQCC_FAILED'),原因为'2035'('MQRC_NOT_AUTHORIZED')

时间:2019-04-18 01:30:03

标签: java jms ibm-mq

我很难连接到我机构的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(...)'.

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

当我传递不同的凭据(用户ID:ABC123)时,MQ日志会看到我用来登录计算机的用户ID(用户ID: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服务。

1 个答案:

答案 0 :(得分:1)

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

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

ADOPTCTX(YES)是队列管理器上的一项设置,该设置指示一旦验证了用户ID和密码正确后,便应将用户ID(在您的情况下为“ ABC123”)用于所有进一步的安全检查(例如,我可以使用此队列)。如果此设置为NO,则密码验​​证完成后,它将实际使用客户端计算机上登录的用户ID,该用户ID还将发送给队列管理器(在您的情况下为“ XYZ”)。队列管理器似乎就是这种情况。

USER_AUTHENTICATION_MQCSP模式

实际上,可以通过两种方式将用户ID和密码从Java客户端应用程序发送到队列管理器。

  1. 第一个(已有数十年历史)在IBM MQ V8之前使用,并且使用了限制长度的流(每个字段最多12个字符),该流量最初是由DOS SNA客户端用来将两个字段发送到QMgr的。跨网络的这种流也是客户端登录的用户ID发送到队列管理器的方式,因此只能发送一个。
  2. MQ V6中新增了一个功能,它在MQ V8的队列管理器中通过本机检查密码而变得更加有用,它是MQCSP结构,该结构允许使用可变长度的用户ID和密码字段。这与发送客户端登录用户ID的网络流不同,因此两者都发送到队列管理器。

USER_AUTHENTICATION_MQCSP设置为true时,您是在告诉Java客户端使用第二种模式。这提供了被ADOPTCTX(NO)设置触发的机会。如果将其设置为false,则进入队列管理器的唯一用户ID是ABC123(在您的示例中),并且可能会给您带来不同的结果,也许是成功的结果。

USER_AUTHENTICATION_MQCSP设置为false的情况下尝试您的应用程序,当它起作用时,建议您的MQ团队他们应该使用ADOPTCTX(YES)(现在也是默认值),然后可以切换回{{1 }}设置为true。

相关问题