我试图通过安全的SSL通道将消息推送到IBM MQ。这是我第一个与MQ集成的nodejs应用程序,尽管我过去使用.net做过这个。我已经尝试了以下代码,但在例外情况下获得异常。
let hConn;
let cD = new msmq.MQCD();
let cno = new msmq.MQCNO();
let oD = new msmq.MQOD()
oD.ObjectName = config.queueName;
cD.ConnectionName = config.port;
cD.ChannelName = config.channel;
cD.CertificateLabel = config.certLabel;
cD.SSLCipherSpec = config.cipherSpec;
msmq.Connx(config.queueManager, cno, (err, hConn) => {
msmq.Open(hConn, oD, openOptions, (err, hObj) => {
let mqmd = new msmq.MQMD();
let pmo = new msmq.MQPMO();
msmq.Put(hObj, mqmd, pmo, message, (err) => {})
})
})
错误:
error fields.name:MQError fields.message:CONNX: MQCC = MQCC_FAILED [2] MQRC = MQRC_KEY_REPOSITORY_ERROR [2381] [Pkg ver = 0.5.1] fields.mqrcstr:MQRC_KEY_REPOSITORY_ERROR fields.stack:MQError: CONNX: MQCC = MQCC_FAILED [2] MQRC = MQRC_KEY_REPOSITORY_ERROR
我确定它与这行代码有关,但我无法找到任何其他apt属性来设置证书名称或路径,就像我在.net中所做的那样(SSL_CERT_STORE_PROPERTY ,这是我在那里使用的财产)。任何帮助都非常感谢。
cD.CertificateLabel = config.certLabel;
这是我的最新代码,但仍然收到相同的错误
let hConn;
let cD = new msmq.MQCD();
let cno = new msmq.MQCNO();
let oD = new msmq.MQOD();
let cO=new msmq.MQSCO;
oD.ObjectName = config.queueName;
cD.ConnectionName = config.port;
cD.ChannelName = config.channel;
cD.SSLCipherSpec = config.cipherSpec;
cO.KeyRepository = 'path of the cert file' (.pfx)
cno.ClientConn = cD;
cno.SSLConfig=cO;
msmq.Connx(config.queueManager, cno, (err, hConn) => {
msmq.Open(hConn, oD, openOptions, (err, hObj) => {
let mqmd = new msmq.MQMD();
let pmo = new msmq.MQPMO();
msmq.Put(hObj, mqmd, pmo, message, (err) => {})
})
})
解决方案:
我最终通过传递keyRepo和certLabel以及.kdb和.sth格式的cert文件来解决我的问题。我遇到的问题是用户名超过12个字符,因此我使用了certLabel,标准符号后面的标识符少于12个字符' ibmwebspheremq'
cO.CertificateLabel = config.certLabel;
cO.KeyRepository = 'path of the cert file and key name' (no extension in the file name)
客户端.ini文件(在其SSL部分中)CertificateLabel属性 - 以下链接中的这一步必须使上述代码正常工作,实际上如果你有这个设置,你甚至不需要通过证书标签在服务器端
https://www.ibm.com/support/knowledgecenter/en/SSFKSJ_9.0.0/com.ibm.mq.sec.doc/q014340_.htm
答案 0 :(得分:0)
MQSCO结构用于命名密钥库。然后,它与MQCD一起附加到MQCNO。
答案 1 :(得分:0)
在MQ中,您需要首先寻找的是原因代码。
MQError:CONNX:MQCC = MQCC_FAILED [2] MQRC = MQRC_KEY_REPOSITORY_ERROR
MQRC_KEY_REPOSITORY_ERROR(2381)的原因代码是重要的一点。如果你查看MQ KnowLedge中心here,你会看到:
在MQCONN或MQCONNX调用上,密钥存储库的位置未指定,无效,或者在用于访问密钥存储库时导致错误。密钥存储库的位置由以下之一指定:
对于MQCONNX调用,如果同时指定了MQSSLKEYR和KeyRepository,则使用后者。