首页 > 解决方案 > 使用 Java 客户端连接到 MQ 通道:CERTLABL 错误

问题描述

我正在使用 Java 开发一个微服务,以通过 SSL 连接到 IBM Websphere MQ V8.0。但是,我在日志中看到了这个错误:

JMSCMQ0001:IBM MQ 调用失败,compcode '2' ('MQCC_FAILED') 原因 '2059' ('MQRC_Q_MGR_NOT_AVAILABLE')

在 MQ 端,错误是CSQX673E,原因是:

SSL 或 TLS 通道的通道名称配置为使用证书标签:cert-label。但是,远程对等方没有发送必要的信息以允许本地通道使用正确的证书。远程主机是 conn-id。

有人可以让我知道如何使用 Java 传递此参数。

据我了解,CERTLABL不是证书的一部分。

标签: javasslssl-certificateibm-mq

解决方案



请注意,以下信息在 MQ v8.0.0、v9.0.0 和 v9.1.0 知识中心中的记录相同。


IBM MQ 8.0.0 知识中心页面IBM MQ>安全性>安全性概述>IBM MQ 安全性机制>IBM MQ 中的安全性协议>SSL 或 TLS 密钥存储库>数字证书标签中的 IBM 文档,了解以下要求

IBM MQ 版本 8.0 支持在同一个队列管理器上使用多个证书,使用每个通道的证书标签属性。队列管理器的入站通道(例如,服务器连接或接收器)依赖于使用 TLS 服务器名称指示 (SNI) 检测通道名称,以便从队列管理器提供正确的证书。

同一页面也记录了这一点:

请注意,入站通道(包括接收器、集群接收器、非限定服务器和服务器连接通道)仅在远程对等点的 IBM MQ 版本完全支持证书标签配置并且通道使用 TLS CipherSpec 时才发送配置的证书。

在所有其他情况下,队列管理器 CERLABL 参数确定发送的证书。特别是,以下仅接收由队列管理器的 CERLABL 参数配置的证书,而不考虑特定于通道的标签设置:

  • 所有当前的 Java 和 JMS 客户端。
  • IBM MQ 版本 8.0 之前的版本。

IBM 还在 IBM MQ 8.0.0 知识中心页面IBM MQ>Reference>Configuration reference>Channel attributes>Channel attributes in letters order>Certificate label (CERTLABL)中记录了类似信息:

入站通道(包括 RCVR、CLUSRCVR、不合格的 SERVER 和 SVRCONN 通道)仅在远程对等点的 IBM® MQ 版本完全支持证书标签配置并且通道使用 TLS CipherSpec 时才会发送配置的证书。如果不是这种情况,队列管理器 CERLABL 属性将确定发送的证书。此限制是因为入站通道的证书标签选择机制取决于并非在所有情况下都支持的 TLS 协议扩展。特别是Java™ 客户端、JMS 客户端,并且版本 8.0 之前的所有 IBM MQ 版本不支持所需的协议扩展,并且只会接收由队列管理器 CERTLABL 属性配置的证书,而不管特定于通道的标签设置如何。


正如您所说,Java 8 确实支持 SNI,但显然 IBM 尚未在 IBM MQ Classes for Java 或 IBM MQ Classes for JMS 中实现该功能。

我能想到的一种可能的解决方案是,您可以找出 MQ 调用哪个底层函数来创建 TLS 会话并覆盖它以将 SNI 属性设置为 MQ 将在队列管理器上识别的值,代码如下:

SSLParameters params = sslSocket.getSSLParameters();
params.setServerNames(serverNames);
sslSocket.setSSLParameters(params);

IBM 在技术说明“ IBM WebSphere MQ:MQ 如何提供多个证书(CERTLABL)能力”中记录了通道名称在 SNI 中传递的格式:

MQ 使用的 SNI 地址基于所请求的通道名称,后跟“.chl.mq.ibm.com”后缀。

MQ 通道名称映射为有效的 SNI 名称,如下所示:

  • 大写字母 AZ 折叠成小写
  • 数字 0 到 9 保持不变
  • 包括小写字母 az 在内的所有其他字符都将转换为其后跟连字符的 2 位十六进制 ASCII 字符代码。
  • 小写字母 a 到 z 分别映射到“61-”到“7a-”
  • 百分比 (%) 映射到“25-”
  • 连字符 (-) 映射到“2d-”
  • 点 (.) 映射到“2e-”
  • 正斜杠 (/) 映射到“2f-”
  • 下划线 (_) 映射到“5f-”

在 EBCDIC 平台上,通道名称在应用此映射之前转换为 ASCII。例如,通道名称“TO.QMGR1”映射到 SNI 地址“to2e-qmgr1.chl.mq.ibm.com”。

相比之下,小写通道名称“to.qmgr1”映射到“74-6f-2e-71-6d-67-72-1.chl.mq.ibm.com”的 SNI 地址。


推荐阅读