【问题标题】:Could not Connect to IBMMQ 7.5 using SSL无法使用 SSL 连接到 IBMMQ 7.5
【发布时间】:2020-04-23 12:52:15
【问题描述】:

当我切换到 7.5(DLL 和服务器)时,以下代码在 IBMMQ 8.0 DLL 和服务器上工作正常,它使用相同的证书给我这个错误

无法使用 SSL 密钥存储库,因为 MQ 无法获取 访问它的密码。导致此错误的原因包括:&B (a) 密钥数据库文件和密码存储文件不存在于 为密钥存储库配置的位置,&B (b) 密钥 数据库文件存在于正确的位置,但没有密码存储 文件已为其创建,&B (c) 文件存在于 正确的地方,但用户 ID 下

public void test() {
    Environment.SetEnvironmentVariable("MQCCSID", "437");

    MQQueueManager mQQueueManager = null;
    MQQueue mQQueue = null;
    Hashtable hashTable = null;
    try {
        hashTable = new Hashtable();
        // Setup properties for connection
        hashTable.Add(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_MANAGED);
        hashTable.Add(MQC.HOST_NAME_PROPERTY, "IP");
        hashTable.Add(MQC.PORT_PROPERTY, 1414);
        hashTable.Add(MQC.CHANNEL_PROPERTY, "Channel");
        hashTable.Add(MQC.PASSWORD_PROPERTY, "123");
        hashTable.Add(MQC.USER_ID_PROPERTY, "user");

        mQQueueManager = new MQQueueManager("QueueName", hashTable);

        // Open queue for browsing
        mQQueue = mQQueueManager.AccessQueue("que", MQC.MQOO_BROWSE | MQC.MQOO_FAIL_IF_QUIESCING);

        ListOfMessages = new List < MQMessageDto > ();
        // In a loop browse all messages till we reach end of queue
        while (true) {
            try {
                // Need to create objects everytime
                var mQMessage = new MQMessage();

                var mQGetMessageOptions = new MQGetMessageOptions {
                    // Use browse next option to start browsing
                    Options = MQC.MQGMO_BROWSE_NEXT
                };
                mQQueue.Get(mQMessage, mQGetMessageOptions);
                ListOfMessages.Add(new MQMessageDto() {
                    Id = ListOfMessages.Count + 1,
                    Message = Encoding.UTF8.GetString(mQMessage.ReadBytes(mQMessage.MessageLength))
                });
            } catch (MQException mqex) {
                if (ListOfMessages.Count == 0) {
                    MessageBox.Show("There is no messages in MQ");
                }
                mQQueue.Close();
                break;
            }
        }
        mQQueueManager.Disconnect();

        grdMessages.DataSource = ListOfMessages;
        grdMessages.Columns["Id"].Width = (int)(grdMessages.Width * 0.1);
        grdMessages.Columns["Message"].Width = (int)(grdMessages.Width * 0.8);
    } catch (Exception ex) {
        MessageBox.Show(ex.Message);
    }
}




【问题讨论】:

  • 我建议停止使用 IBM MQ :) ...我浪费了 3 周的时间试图解决这个问题。

标签: c# ibm-mq


【解决方案1】:

您所描述的意味着您在 IBM 方面的配置错误,并且由于您使用的是 IBM MQ 7.5。我认为您的 SSL 密钥存储库的路径错误,它应该指向密钥名称而不是文件夹。

还要确保您已从频道内的 SSL 选项卡中选择了可选。

更多细节..关于这个问题的更多细节可以在这里找到关于错误这个错误代码: 2538 error on MQ for SSL channel connection

【讨论】:

    【解决方案2】:

    您没有提及您使用的是哪个特定级别的 7.5。如果是 7.5.0.7 或更早版本,则可能是 stash 文件存在问题:

    https://www.ibm.com/support/knowledgecenter/en/SSFKSJ_9.1.0/com.ibm.mq.mig.doc/q128820_.htm

    MQ (GSKit) 使用的加密提供程序的旧版本使用不同的存储文件格式作为密钥库密码。

    虽然较新的 GSKit 版本可以处理旧的存储文件格式,但较旧的 GSKit 版本无法读取新格式。如果您使用的是使用新格式的关卡,您可以使用 -v1stash 选项创建一个向后兼容的存储文件:

    runmqakm -keydb -stashpw -db <filename> -pw <password> -v1stash
    

    更好的选择是使用更新的客户端级别,因为 MQ 7.5 不再支持,如果需要,它仍然可以与 7.5 队列管理器通信。

    作为参考,第一个使用新存储文件格式的 GSKit 级别是 8.0.50.69。这里列出了与 MQ 捆绑的 GSKit 级别:https://www.ibm.com/support/pages/levels-jre-and-gskit-bundled-ibm-mq

    【讨论】:

    • 我使用的是 7.5.0.2,我尝试使用 8.0.0.5 客户端进行连接,但没有成功。
    • @Selwade - 根据我帖子中的第一个链接,您至少需要使用 8.0.0.6 客户端才能使用新格式的存储文件(8.0.0.14 是最新的可用 v8客户端,但您也可以使用最新的 9.1.0.5 客户端和 7.5 队列管理器)。
    • 当我将客户端升级到 V9 时,客户端上出现“MQRC_Q_MGR_NOT_AVAILABLE”和“4/23/2020 21:03:22 - Process(11764.64) User() Program(amqrmppa.exe) Host(HOST) Installation(Installation1) VRMF(7.5.0.2) QMgr() 远程通道 '' 没有指定 CipherSpec。远程通道 '' 没有指定 CipherSpec 当本地通道期望指定一个。&P 远程主机是'.*.*.* (..*.*)'。&P 频道没有启动。更改远程频道' ' 在主机 ()' 上指定一个 CipherSpec,以便通道的两端都有匹配的 CipherSpec。”在服务器中
    【解决方案3】:

    关于:

    当我将客户端升级到 V9 时,客户端上出现“MQRC_Q_MGR_NOT_AVAILABLE”和“4/23/2020 21:03:22 - Process(11764.64) User() Program(amqrmppa.exe) Host(HOST) Installation (安装1)VRMF(7.5.0.2)QMgr()远程通道''没有指定CipherSpec。当本地通道期望指定一个时,远程通道''没有指定CipherSpec。&P远程主机是'。..* (...)'. &P 通道没有启动。更改远程通道 '' on host ()' 指定一个 CipherSpec 以便两端的通道具有匹配的 CipherSpecs。”在服务器中

    显示正在使用的密码规范dis chl(xxx) SSLCIPH 您可能指定了基础 TLS 支持不再支持的内容。

    dis chl(xxx)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-01
      • 2017-07-31
      • 1970-01-01
      • 1970-01-01
      • 2012-02-09
      • 2015-09-29
      • 2015-10-31
      • 1970-01-01
      相关资源
      最近更新 更多