无法从Nodejs / MQRC_KEY_REPOSITORY_ERROR / MQRC_SSL_INITIALIZATION_ERROR将SSL客户端证书传递给IBM MQ

时间:2018-04-25 04:20:24

标签: node.js ibm-mq

我试图通过安全的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

2 个答案:

答案 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调用上,密钥存储库的位置未指定,无效,或者在用于访问密钥存储库时导致错误。密钥存储库的位置由以下之一指定:

  • MQSSLKEYR环境变量的值(MQCONN或MQCONNX ()或
  • MQSCO结构中KeyRepository字段的值 (仅限MQCONNX呼叫)。

对于MQCONNX调用,如果同时指定了MQSSLKEYR和KeyRepository,则使用后者。