java - 使用 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
不是证书的一部分。
解决方案
请注意,以下信息在 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 地址。
推荐阅读
- mysql - 需要帮助故障排除代码以将 iOS 应用调查数据上传到 mysql 数据库
- arrays - 在php中将数组拆分为新行
- excel - VBA 保存为免费宏,然后重新打开启用宏的原始工作簿
- swift - 解析查询中没有更多上下文错误的模棱两可
- javascript - 如何将供应商 JS 文件正确输入到 Rails 6?
- java - 在最新的 Eclipse IDE maven java 项目中与 src/test/java 并行创建的新文件夹中的测试用例未执行测试用例
- flutter - 使用颤振触发警报时运行本机代码
- python - 用于寻找导数转折点的python方程,同时也最有效地使用成本
- c# - 查看哈希集中的字符串是否包含来自另一个哈希集中的元素的最佳方法?C#
- types - OCaml 期望在模式匹配期间不会出现在任何地方的模式