使用IBM JDK 8和IBM MQ v8时错误码2、原因码2400排查求助
IBM MQ v8 + IBM JDK 8 错误码2/2400(MQRC_UNSUPPORTED_CIPHER_SUITE)代码排查及修复
代码核心问题
密钥库密码属性拼写错误
代码中javax.net.ssl.keytStorePassword为错误属性名,正确应为javax.net.ssl.keyStorePassword(多写了一个t),该错误会导致密钥库加载失败,直接中断SSL cipher suite协商流程。IBM专属Cipher Suite映射未关闭
IBM JDK默认启用MQ专属的Cipher Suite命名映射逻辑,你配置的SSL_ECDHE_RSA_WITH_AES_256_CBC_SHA384是标准JCE命名格式,在映射开启状态下无法被MQ识别,从而触发MQRC_UNSUPPORTED_CIPHER_SUITE错误。
修复方案
修正密钥库密码属性名
替换错误代码行:System.setProperty("javax.net.ssl.keyStorePassword", "changeit");关闭IBM Cipher Suite映射
取消注释以下代码,强制MQ使用标准JCE的Cipher Suite命名规则:System.setProperty("com.ibm.mq.cfg.useIBMCipherMappings", "false");若不想关闭映射,也可将
sslCipherSuite替换为IBM MQ对应的别名,比如ECDHE_RSA_AES_256_CBC_SHA384。验证密钥库有效性
确认/home/oracle/cert/jks/cert.jks路径正确、运行程序的用户有文件读取权限,且JKS内包含完整的客户端证书及CA信任链。
修复后示例代码
public static void main(String[] args) { int i = 0; System.setProperty("javax.net.ssl.keyStore", "/home/oracle/cert/jks/cert.jks"); System.setProperty("javax.net.ssl.keyStorePassword", "changeit"); System.setProperty("com.ibm.mq.cfg.useIBMCipherMappings", "false"); String str1 = "hostname.com"; String str2 = "1400"; String str3 = "TEST.1"; String str4 = "QMG2"; String str5 = "P.OUT.TRD"; try { MQEnvironment.hostname = "hostname.com"; MQEnvironment.port = Integer.valueOf(str2).intValue(); MQEnvironment.channel = str3; MQEnvironment.userID = "username"; MQEnvironment.sslCipherSuite = "SSL_ECDHE_RSA_WITH_AES_256_CBC_SHA384"; MQEnvironment.properties.put("transport", "MQSeries"); MQQueueManager mQQueueManager = new MQQueueManager(str4); System.out.println("Connected to QMGR "); byte b = 16; MQQueue mQQueue = mQQueueManager.accessQueue(str5, b, null, null, null); i = mQQueue.getCurrentDepth(); System.out.println(i); mQQueue.close(); mQQueueManager.disconnect(); } catch (MQException mQException) { mQException.printStackTrace(); } }
额外检查项
确认MQ服务器端通道TEST.1配置的Cipher Suite与客户端完全一致,否则仍会出现不兼容错误。
内容的提问来源于stack exchange,提问作者Kuda Home
相关产品推荐
相关产品推荐

