我正在使用 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 时才发送配置的证书。
在所有其他情况下,队列管理器 CERTLBL 参数确定发送的证书。特别是,以下只接收由队列管理器的 CERTLBL 参数配置的证书,而不管特定于通道的标签设置如何:
- 所有当前的 Java 和 JMS 客户端。
- IBM MQ 8.0 之前的版本。
IBM 还在 IBM MQ 8.0.0 知识中心页面IBM MQ>参考>配置参考>通道属性>按字母顺序排列的通道属性>证书标签 (CERTLABL) 中记录了类似信息:
入站通道(包括 RCVR、CLUSRCVR、不合格的 SERVER 和 SVRCONN 通道)仅在远程对等方的 IBM® MQ 版本完全支持证书标签配置并且通道使用 TLS CipherSpec 时才会发送配置的证书。如果不是这种情况,队列管理器 CERTLBL 属性将确定发送的证书。此限制是因为入站通道的证书标签选择机制取决于并非在所有情况下都支持的 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”映射到“to2e-qmgr1.chl.mq.ibm.com”的 SNI 地址。
相比之下,小写的通道名称“to.qmgr1”映射到“74-6f-2e-71-6d-67-72-1.chl.mq.ibm.com”的SNI地址。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句