Невозможно передать SSL-сертификат клиента в IBM MQ из Nodejs / MQRC_KEY_REPOSITORY_ERROR / MQRC_SSL_INITIALIZATION_ERROR - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь отправить сообщения в 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

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

В MQ первое, что вам нужно искать, это код причины.

MQError: CONNX: MQCC = MQCC_FAILED [2] MQRC = MQRC_KEY_REPOSITORY_ERROR

Код причины MQRC_KEY_REPOSITORY_ERROR (2381) является важным битом. Если вы посмотрите в MQ KnowLedge Center здесь , вы увидите:

При вызове MQCONN или MQCONNX местоположение хранилища ключей либо не указано, либо недопустимо, либо приводит к ошибке при использовании для доступа к хранилищу ключей. Расположение хранилища ключей указывается одним из следующих способов:

  • Значение переменной среды MQSSLKEYR (MQCONN или MQCONNX вызов) или
  • Значение поля KeyRepository в структуре MQSCO (Только вызов MQCONNX).

Для вызова MQCONNX, если указаны и MQSSLKEYR, и KeyRepository, используется последний.

0 голосов
/ 25 апреля 2018

Структура MQSCO используется для именования хранилища ключей.Затем это присоединяется к MQCNO вместе с MQCD.

...