【问题标题】:MQ Upgrade from 7 to 9. Getting DetailedJMSSecurityExceptionMQ 从 7 升级到 9。获取详细 JMSSecurityException
【发布时间】:2017-11-02 17:35:35
【问题描述】:

我的应用程序使用 MQ 7 和以下驱动程序 - com.ibm.mq.jmscom.ibm.mq.jmqicom.ibm.mq.pcf - 版本 7.0.1.6。我们最近升级到 MQ 9,所以我用com.ibm.mq.allclientcom.ibm.mq.traceControl(版本 9.0.0.0-p900-L160512.4)和javax-jms-api-2.0.1(必须包含这个 JAR,因为它给出了 JMSRuntimeException 错误)替换了驱动程序这个 JAR 的一部分的类)。现在,当我使用升级的驱动程序尝试连接到 MQ 9 服务器运行应用程序时,我收到以下错误。当我用以前的驱动程序替换驱动程序时,应用程序按预期工作。

谁能告诉我我用来连接 MQ 9 的驱动程序是否正确?我是否缺少任何其他 JAR 文件?还是有其他原因导致以下错误?

Exception in thread "main" {_name=com.epo.core.SystemException, com.ibm.msg.client.jms.DetailedJMSSecurityException=com.ibm.msg.client.jms.DetailedJMSSecurityException: JMSWMQ2013: The security authentication was not valid that was supplied for QueueManager 'queue' with connection mode 'Client' and host name 'Hostname(port)'.
Please check if the supplied username and password are correct on the QueueManager to which you are connecting.
      at com.ibm.msg.client.wmq.common.internal.Reason.reasonToException(Reason.java:531)
      at com.ibm.msg.client.wmq.common.internal.Reason.createException(Reason.java:215)
      at com.ibm.msg.client.wmq.internal.WMQConnection.<init>(WMQConnection.java:422)
      at com.ibm.msg.client.wmq.factories.WMQConnectionFactory.createV7ProviderConnection(WMQConnectionFactory.java:8475)
      at com.ibm.msg.client.wmq.factories.WMQConnectionFactory.createProviderConnection(WMQConnectionFactory.java:7913)
      at com.ibm.msg.client.jms.admin.JmsConnectionFactoryImpl._createConnection(JmsConnectionFactoryImpl.java:299)
      at com.ibm.msg.client.jms.admin.JmsConnectionFactoryImpl.createConnection(JmsConnectionFactoryImpl.java:236)
      at com.ibm.mq.jms.MQConnectionFactory.createCommonConnection(MQConnectionFactory.java:6024)
      at com.ibm.mq.jms.MQQueueConnectionFactory.createQueueConnection(MQQueueConnectionFactory.java:111)
      . . .
Caused by: com.ibm.mq.MQException: JMSCMQ0001: IBM MQ call failed with compcode '2' ('MQCC_FAILED') reason '2035' ('MQRC_NOT_AUTHORIZED').
      at com.ibm.msg.client.wmq.common.internal.Reason.createException(Reason.java:203)
      ... 14 more
}

【问题讨论】:

  • MQ 队列管理器有什么版本?它是否也升级或更改了?您能否在获得JMSWMQ2013 的同时找出队列管理器AMQERR01.LOG 中出现的错误。如果您提供与JMSWMQ2013 一起提供的链接异常,也会很有帮助。您能否提供示例代码来展示如何将 Java 应用程序中的凭证传递给 IBM MQ。如果 MQ 服务器是 v8 或更高版本,则提供 DIS QMGR CONNAUTHDIS AUTHINFO(&lt;value from QMGR CONNAUTH&gt;) ALL 的输出。对于 v7.1 及更高版本,包括 v8/v9 还提供DIS QMGR CHLAUTH
  • 另外,请确保您单击问题下方的编辑链接并将详细信息添加到您的问题中,不要尝试将它们添加为 cmets,因为它们的格式不正确且不可搜索。
  • 我将再次询问我在第一条评论中提供的所有信息,以帮助您解决问题,您似乎提供了链接的异常,但如果没有服务器端错误日志详细信息,它会只是一个猜测。 @a_cornish_pasty 答案很可能是问题的原因。

标签: java ibm-mq


【解决方案1】:

正如@JoshMc 在他的评论中所建议的那样,您需要查看队列管理器错误日志(AMQERR01.log 文件),因为队列管理器可能正在向应用程序返回 MQRC_NOT_AUTHORIZED (2035) 原因代码。您可以在应用程序收到的链接异常中确认这一点。

鉴于您列出的版本,一种可能性是客户端现在在连接尝试期间将用户标识符流向队列管理器,以便在客户端库升级之后进行身份验证,而之前不是。

在 MQ v7.0.1.x Java/JMS 客户端中,可以不指定用户名,因此 Java/JMS 客户端不会将用户名传递给队列管理器。当通过服务器连接通道未设置 MCAUSER 的 TCP/IP(客户端传输)进行连接时,来自应用程序的连接将采用通道进程正在运行的用户“mqm”,这将被授权连接 - 所以没有 2035。

从 MQ V7.1 开始,Java/JMS 客户端将将空白用户标识符流向队列管理器。如果应用程序未指定用户标识符,则在连接请求期间,Java 系统属性“user.name”(即为应用程序启动 JVM 的用户)的值将流向队列管理器。如果该用户没有被授予队列管理器的必要权限,连接请求将被拒绝,原因码为 2035。队列管理器错误日志可能会报告哪个用户 id 没有被授权。

以下技术说明从 WebShere 应用程序服务器的角度讨论了这一点,但对于独立的 Java SE 应用程序也是如此:

http://www-01.ibm.com/support/docview.wss?uid=swg21662193

【讨论】:

    猜你喜欢
    • 2020-08-27
    • 1970-01-01
    • 2020-09-19
    • 1970-01-01
    • 1970-01-01
    • 2020-05-30
    • 1970-01-01
    • 2020-06-09
    • 1970-01-01
    相关资源
    最近更新 更多