使用Java客户端连接到MQ通道:CERTLABL错误

时间:2018-08-10 13:40:16

标签: java ssl ssl-certificate ibm-mq

我正在研究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不是证书的一部分。

1 个答案:

答案 0 :(得分:0)


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


IBM文档中的 IBM MQ 8.0.0知识中心页面IBM MQ>Security>Security overview>IBM MQ security mechanisms>Security protocols in IBM MQ>The SSL or TLS key repository>Digital certificate labels, understanding the requirements如下:

  

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

同一页上也记录了以下内容:

  

请注意,入站通道(包括接收器,群集接收器,   不合格的服务器和服务器连接渠道)仅发送   配置的证书(如果远程对等方的IBM MQ版本完全)   支持证书标签配置,并且该通道正在使用   TLS CipherSpec。

     

在所有其他情况下,队列管理器的CERTLABL参数确定   证书已发送。特别是以下内容   由队列的CERTLABL参数配置的证书   经理,而与渠道特定的标签设置无关:

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

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

  

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


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

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

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

IBM已在技术说明“ IBM WebSphere MQ: How does MQ provide multiple certificates (CERTLABL) capability”中记录了通道名称在SNI中传递的格式:

  

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

     

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

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

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

     

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