通过TLS连接IBM MQ时遇SSL握手失败错误求助
IBM MQ TLS握手失败(Remote host terminated the handshake)排查与解决
错误信息
javax.net.ssl|ERROR|10|main|2024-07-11 15:28:58.816 MSK|TransportContext.java:363|Fatal (HANDSHAKE_FAILURE): Couldn't kickstart handshaking ( "throwable" : { javax.net.ssl.SSLHandshakeException: Remote host terminated the handshake )
1. SSLCAUTH强制验证导致客户端证书未被MQ信任
你将通道配置为SSLCAUTH(REQUIRED),这要求客户端必须提供合法证书,且该证书需被MQ信任。当前仅将QM证书导入了客户端信任库,但未将客户端证书导入MQ的信任库,MQ验证客户端证书时失败,直接终止握手。
解决步骤:
- 导出客户端证书(先确认客户端证书标签,可用
runmqakm -cert -list -db client_key.p12 -pw qwe查看):cd /mnt/mqm/MQClient/certs runmqakm -cert -extract -db client_key.p12 -pw qwe -label client_cert -target client.cert - 将客户端证书导入MQ的keystore:
cd /mnt/mqm/MQServer/certs runmqakm -cert -add -db key.p12 -stashed -label client_cert -trust enable -file ../../MQClient/certs/client.cert - 重启MQ容器:
docker restart ibmmq
2. 密码套件不匹配
你关闭了IBM密码映射(com.ibm.mq.cfg.useIBMCipherMappings=false),但客户端指定的*TLS12并非标准Java密码套件名称,而通道配置的ANY_TLS12是IBM套件别名,两者无法匹配导致握手失败。
解决方法二选一:
- 方法一:使用标准Java密码套件名称,修改客户端代码:
同时可同步修改通道配置(可选,factory.setStringProperty(WMQConstants.WMQ_SSL_CIPHER_SUITE, "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384");ANY_TLS12也兼容TLS1.2标准套件):ALTER CHANNEL(DEV.ADMIN.SVRCONN) CHLTYPE(SVRCONN) SSLCIPH(TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) - 方法二:开启IBM密码映射,修改客户端代码:
System.setProperty("com.ibm.mq.cfg.useIBMCipherMappings", "true"); factory.setStringProperty(WMQConstants.WMQ_SSL_CIPHER_SUITE, "ANY_TLS12");
3. MQ Keystore权限不足
Docker容器内MQ以mqm用户运行,若/mnt/mqm/MQServer/certs/key.p12的权限不允许mqm读取,会导致无法加载证书。
解决步骤:
- 进入容器检查权限:
docker exec -it ibmmq bash ls -l /mnt/mqm/MQServer/certs/key.p12 - 若权限不足,在宿主机修改权限:
(1001是容器内chown -R 1001:1001 /mnt/mqm/MQServer/certsmqm用户的默认UID/GID)
4. 确认Keystore配置生效
检查MQ是否正确加载了指定的keystore:
docker exec -it ibmmq bash echo "DISPLAY QMGR SSLKEYR" | runmqsc QM1
输出应显示SSLKEYR(/mnt/mqm/MQServer/certs/key)(MQ会自动省略.p12后缀),若未显示,需确认MQ_TLS_KEYSTORE环境变量路径是否正确。
内容的提问来源于stack exchange,提问作者SalganikMY
相关产品推荐
相关产品推荐

