按名称连接到队列管理器时出现 MQ 错误代码 2058

MQ error code 2058 when connecting to queue manager by name

当 运行 从我的工作站到远程 MQ 服务器的基本连接测试时,我遇到了一个奇怪的行为。

我正在使用 amqssslc.exe 从命令提示符连接。

如果我只连接证书存储,它会毫无问题地连接,并且 returns 结果表明它连接到默认队列管理器,FOO:

C:\Program Files\IBM\MQ\Tools\c\Samples\Bin64>amqssslc.exe -k c:\mycerts\cert

Sample AMQSSSLC start
Connecting to the default queue manager
No client connection information specified.
Using SSL key repository stem c:\mycerts\cert
No OCSP configuration specified.
Connection established to queue manager FOO
Sample AMQSSSLC end

但是,如果我尝试连接到队列管理器 FOO,它会 returns 一个 2058 错误,这通常表示队列管理器名称错误。

C:\Program Files\IBM\MQ\Tools\c\Samples\Bin64>amqssslc.exe -k c:\mycerts\cert -m FOO

Sample AMQSSSLC start
Connecting to queue manager FOO
No client connection information specified.
Using SSL key repository stem c:\mycerts\cert
No OCSP configuration specified.
MQCONNX ended with reason code 2058

即使我直接从结果中复制名称,它也会这样做。它很快就会失败,并且不会在我的 AMQERR01.LOG 文件中生成日志条目。

此行为是否表明我的 CCDT 文件存在问题?


更新:

根据@JoshMc 的建议,我运行 使用以下命令获取有关供应商提供的 CCDT 文件的信息:

echo DIS CHL(*) QMNAME CONNAME|runmqsc -n

结果表明文件中没有指定队列管理器:

C:\Program Files\IBM\MQ\Tools\c\Samples\Bin64>echo DIS CHL(*) QMNAME CONNAME|runmqsc -n
5724-H72 (C) Copyright IBM Corp. 1994, 2016.
Starting local MQSC for 'MYQUEUE.TAB'.
 1 : DIS CHL(*) QMNAME CONNAME
AMQ8414: Display Channel details.
   CHANNEL(FOOCHANNEL)                CHLTYPE(CLNTCONN)
   CONNAME(CONNAME(xxx.xxx.xxx.xxx(1414),xxx.xxx.xxx.xxx(1414))
   QMNAME( )

No commands have a syntax error.

I'm experiencing an odd behavior when running basic connectivity tests from my workstation to a remote MQ Server.

这不是程序。您没有指定足够的参数。你是发布"amqssslc.exe ?"还是查看源码?即 amqssslc.c

频道名称在哪里?连接名称在哪里? CipherSpec 在哪里?等...

如果您查看位于 C:\Program Files\IBM\MQ\Tools\c\Samples\Bin64\amqssslc.c 的源代码,您可以看到它执行以下操作:

  1. 如果未指定队列管理器名称,它将队列管理器名称设置为 NULL 并打印 Connecting to the default queue manager
  2. 如果未指定连接名称,则不会设置 ClientConn,并且 ConnectOptions.ClientConnPtr 将保留其默认 NULL 值,它将打印 No client connection information specified.
  3. 如果指定了 SSL 密钥存储库主干,它将 SslConnOptions.KeyRepository 设置为此值并打印出 Using SSL key repository stem <stem location>,然后将 ConnectOptions.SSLConfigPtr 指向 SslConnOptions

完成所有这些之后,它会发出 MQCONNX 并指定 NULL 队列管理器名称和 ConnectOptions。因为 ConnectOptions.ClientConnPtr 保留为默认 NULL 值,MQ 将尝试找出如何通过其他几种不同的方式连接到队列管理器。查找连接信息的顺序和位置记录在 IBM v7.5(或更高版本)知识中心页面“Connecting IBM WebSphere MQ MQI client applications to queue managers”。在您的情况下,它正在获取 CCDT 文件。

当您未指定队列管理器名称时,它会在 CCDT 中查找具有空白 QMNAME 属性的条目,并找到您在 QMNAME 中定义的 CLNTCONN 通道是空白的。 CLNTCONN 通道上的空白 QMNAME 是一种特殊情况,在这种情况下,MQ 客户端将连接到任何正在侦听您指定的 CONNAME 的队列管理器名称。因为您正在指定 SSL 密钥存储库 stem,所以它将使用此密钥存储库通过您在 CCDT 的 CLNTCONN 上指定的 SSLCIPH 连接到 MQ。

当您 指定队列管理器名称FOO 时,它会尝试在 CCDT 中查找 QMNAME 属性设置为 FOO,在您的情况下它不存在,因此您会收到 2058MQRC_Q_MGR_NAME_ERROR 错误。


根据您的更新,CCDT 频道确实有一个空白的 QMNAME 属性,并且 CONNAME 列出了两个不同的 IP(PORT),由公共 IP 分隔。使用此配置,MQ 将首先尝试连接到第一个 IP,如果连接超时或由于某些其他原因(例如队列管理器上的通道处于 STOPPED 状态)而终止,它将尝试连接到第二个 IP。

他们很可能打算让您使用空白或 NULL 队列管理器名称进行连接,因为客户端将连接到任何正在侦听 CONNAME 的队列管理器名称,在您的情况下是第一个 IP (PORT) 可能是队列管理器 FOO,第二个 IP(PORT) 可能是队列管理器 BAR。


如果您希望它在指定 -m FOO 时与您的 CCDT 一起工作,您需要创建一个带有 CLNTCONN 通道和 QMNAME(FOO) 的新 CCDT,或者添加另一个 CLNTCONN 通道到您现有的 CCDT QMNAME(FOO),注意您不能在单个 CCDT 中有重复的通道名称。


有关 CCDT 和要指定的队列管理器名称的更多信息,请参阅我对“”的回答。答案与 JMS 有关,但信息也适用于 MQI 客户端。


您还可以选择在命令行上指定所有详细信息,如 Roger 所说。 运行 amqssslc.exe ? 使用信息,应该是这样的:

Sample AMQSSSLC start
Parameters:  [-m QMgr]
  [-c ChlName -x ConnName]
  [-k KeyReposStem] [-s CipherSpec]
  [-p any|rfc5280]
  [-f] [-b none|128_bit|192_bit[,...] ]
  [-o OcspURL]