从工作站到远程MQ服务器运行基本连接测试时,我遇到了奇怪的行为。
我正在使用amqssslc.exe从命令提示符进行连接。
如果我只连接证书存储,它连接没有问题,并返回一个结果,表明它连接到默认队列管理器,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,它将返回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.
答案 0 :(得分:1)
如果您查看位于C:\Program Files\IBM\MQ\Tools\c\Samples\Bin64\amqssslc.c
的源代码,则可以看到它执行以下操作:
NULL
并打印Connecting to the default queue manager
ClientConn
,并且ConnectOptions.ClientConnPtr
保留默认NULL
值,它将打印No client connection information specified.
SslConnOptions.KeyRepository
设置为此值并打印出Using SSL key repository stem <stem location>
,然后将ConnectOptions.SSLConfigPtr
指向SslConnOptions
。完成所有这些后,它会发出MQCONNX
并指定NULL
队列管理器名称和ConnectOptions
。因为ConnectOptions.ClientConnPtr
保留在默认的NULL
值,MQ将尝试通过几种不同的方式找出如何连接到队列管理器。 IBM V7.5(或更高版本)知识中心页面&#34; Connecting IBM WebSphere MQ MQI client applications to queue managers&#34;中记录了查找连接信息的顺序和位置。在你的情况下,它正在拿起CCDT文件。
当您未指定队列管理器名称时,它会在CCDT中查找具有空白QMNAME
属性的条目,并找到您在CLNTCONN
为空的情况下定义的QMNAME
个频道。 QMNAME
通道上的空白CLNTCONN
是一种特殊情况,MQ客户端将连接到任何正在侦听您指定的CONNAME
的队列管理器名称。因为您正在指定SSL密钥存储库,所以它将使用此密钥存储库通过您在CCDT中SSLCIPH
上指定的CLNTCONN
连接到MQ。
当您执行指定队列管理器名称FOO
时,它会尝试在CCDT中找到QMNAME
属性设置为FOO
的条目,您的情况不存在,因此您收到2058
或MQRC_Q_MGR_NAME_ERROR
错误。
根据您的更新,CCDT频道确实有一个空白的QMNAME
属性,CONNAME
列出了一个由公共区分开的两个不同的IP(PORT)。使用此配置,MQ将首先尝试连接到第一个IP,如果连接超时或因某些其他原因(例如队列管理器上的通道处于STOPPED状态)而结束,则它将尝试连接到第二个IP。
由于客户端将连接到正在侦听CONNAME的任何队列管理器名称的好处,他们打算让您连接空白或NULL队列管理器名称,在这种情况下是第一个IP(PORT) )可能是队列管理器FOO,第二个IP(PORT)可能是队列管理器BAR。
如果您希望在指定-m FOO
时使用CCDT,则需要创建一个带有CLNTCONN
QMNAME(FOO)
频道的新CCDT,或添加另一个CLNTCONN
使用QMNAME(FOO)
通道到您现有的CCDT,请注意,在单个CCDT中不能有重复的通道名称。
有关CCDT的更多信息以及要指定的队列管理器名称,请参阅我对#34; Connecting to IBM MQ using CCDT file in JMS&#34;的回答。答案与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]
答案 1 :(得分:0)
我在运行基本连接测试时遇到奇怪的行为 从我的工作站到远程MQ服务器。
它不是该计划。您没有指定足够的参数。你发出了&#34; amqssslc.exe吗?&#34;还是看看来源?即amqssslc.c
频道名称在哪里?连接名称在哪里? CipherSpec在哪里?等...