Я пытаюсь отправить сообщения в IBM MQ через защищенный канал SSL. Это мое первое приложение nodejs, которое интегрируется с MQ, хотя я делал это раньше, используя .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, а также файлы cert в форматах .kdb и .sth. Я столкнулся с проблемой, когда имя пользователя было более 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