【问题标题】:IBM MQ call failed with compcode '2' ('MQCC_FAILED') reason '2035' ('MQRC_NOT_AUTHORIZED')IBM MQ 调用失败,compcode '2' ('MQCC_FAILED') 原因 '2035' ('MQRC_NOT_AUTHORIZED')
【发布时间】:2019-04-18 01:30:03
【问题描述】:

我很难连接到我机构的 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 年 4 月 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 服务。

【问题讨论】:

  • 队列管理器连接对象是否有ADOPTCTX(YES)?频道的CLNTUSER 值是否会根据您设置USER_AUTHENTICATION_MQCSP 的方式而改变?您能否提供该频道的所有CHLAUTH 规则?
  • USERID 属性中指定的值的长度是多少?
  • 当您将 csp 设置为 false 时,让他们仔细检查错误。
  • 你能检查一下qm.ini中是否有ChlAuthEarlyAdopt=Y吗?如果没有这个,CHLAUTH 规则只会对运行进程的用户起作用,而不是像 USERID 那样设置USER_AUTHENTICATION_MQCSP=true。如果你设置了USER_AUTHENTICATION_MQCSP=false,那么它应该没关系,CHLAUTH 就可以了。
  • 您的密码长度是否可能大于 12 个字符?将 USER_AUTHENTICATION_MQCSP 设置为 false 会限制密码的长度。

标签: java jms ibm-mq


【解决方案1】:

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

队列管理器没有使用 ADOPTCTX(YES)

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

USER_AUTHENTICATION_MQCSP 模式

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

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

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

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

【讨论】:

  • 我确实尝试将USER_AUTHENTICATION_MQCSP 设置为false,但我得到了同样的错误信息。所以,我想我现在唯一的选择是让他们检查他们是否在使用ADOPTCTX(YES)?谢谢。
  • 当您说您收到相同的错误消息时,您的意思是您收到相同的返回码(2035)还是队列管理器上的错误消息相同,即它仍然显示您的客户端机器用户 ID XYZ?
  • 我得到的错误信息是 2035,在 MQ 日志上,它仍然显示用户 ID XYZ 而不是我传入的凭据。
  • 这听起来像是在忽略 USER_AUTHENTICATION_MQCSP 或者可能根本不知道如何使用 MQCSP。您使用的是什么版本的客户端?
  • @limc 不错的帖子:myshittycode.com/2019/04/23/…。对于您的 MQGem Monthly,Morag 可能是一个不错的选择。
猜你喜欢
  • 1970-01-01
  • 2016-05-10
  • 1970-01-01
  • 2018-08-30
  • 2020-04-18
  • 2017-09-29
  • 2014-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多