You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot 3.1.5连接IBM MQ SSL握手失败问题求助

问题

我有一个基于Spring Boot的应用,使用mq-jms-spring-boot-starter连接IBM MQ。此前采用用户名/密码认证连接代理,运行完全正常。
现在需要切换为安全连接,已更新配置文件如下:

ibm.mq.queue-manager=QM1
ibm.mq.channel=QM.SRV01
ibm.mq.conn-name=qm.local(1414)
ibm.mq.user=username
ibm.mq.password=passw0rd
ibm.mq.ssl-cipher-spec=ANY_TLS13_OR_HIGHER
ibm.mq.jks.trust-store=key.jks
ibm.mq.jks.trust-store-password=keyPassw0rd
ibm.mq.jks.key-store=key.jks
ibm.mq.jks.key-store-password=keyPassw0rd

JKS文件包含私钥、证书和CA证书,放置在resources目录下,构建时会复制到target文件夹。
MQ配置类如下(取自IBM MQ文档):

@Configuration
@EnableJms
public class IBMMQConfig {

    @Bean
    public JmsListenerContainerFactory<?> myFactory(ConnectionFactory connectionFactory,
                                                    DefaultJmsListenerContainerFactoryConfigurer configurer) {
        
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        configurer.configure(factory, connectionFactory);
        return factory;
    }
}

启动应用后,出现以下异常:

Caused by: com.ibm.mq.jmqi.JmqiException: CC=2;RC=2397;AMQ9204: Connection to host 'qm.local' rejected. 
...
Caused by: com.ibm.mq.jmqi.JmqiException: CC=2;RC=2397;AMQ9771: SSL handshake failed.
...
Caused by: java.net.SocketException: java.security.NoSuchAlgorithmException: Error constructing implementation
...
Caused by: java.security.NoSuchAlgorithmException: Error constructing implementation
...
Caused by: java.security.KeyManagementException: problem accessing trust store
    at java.base/sun.security.ssl.SSLContextImpl$DefaultManagersHolder.<clinit>(SSLContextImpl.java:942) ~[na:na]
    at java.base/sun.security.ssl.SSLContextImpl$DefaultSSLContext.<init>(SSLContextImpl.java:1111) ~[na:na]
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:na]
    at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) ~[na:na]
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) ~[na:na]
    at java.base/java.security.Provider$Service.newInstanceOf(Provider.java:1879) ~[na:na]
    at java.base/java.security.Provider$Service.newInstanceUtil(Provider.java:1886) ~[na:na]
    at java.base/java.security.Provider$Service.newInstance(Provider.java:1861) ~[na:na]
    at java.base/sun.security.jca.GetInstance.getInstance(GetInstance.java:236) ~[na:na]
    at java.base/sun.security.jca.GetInstance.getInstance(GetInstance.java:164) ~[na:na]
    at java.base/javax.net.ssl.SSLContext.getInstance(SSLContext.java:185) ~[na:na]
    at java.base/javax.net.ssl.SSLContext.getDefault(SSLContext.java:110) ~[na:na]
    at java.base/javax.net.ssl.SSLSocketFactory.getDefault(SSLSocketFactory.java:83) ~[na:na]

JKS文件确实存在,在IBMMQConfig类中设置断点调用getClass().getClassLoader().getResource("key.jks")能获取到资源,但为何仍抛出上述异常?

解决方案

以下是几个可能的原因及对应的解决办法:

1. JKS文件路径配置问题

IBM MQ的ibm.mq.jks.trust-store和ibm.mq.jks.key-store属性默认识别文件系统路径,而非类路径资源。直接写key.jks会让MQ尝试在应用当前工作目录查找,而非类路径中。

解决办法:
添加classpath:前缀指定类路径资源:

ibm.mq.jks.trust-store=classpath:key.jks
ibm.mq.jks.key-store=classpath:key.jks

2. JKS文件格式或密钥库类型不匹配

部分IBM MQ版本默认偏好PKCS12格式而非JKS,或者JKS文件存在格式损坏、密钥/证书条目异常的情况。

解决办法:

  • 用keytool验证JKS有效性:
    keytool -list -keystore key.jks -storepass keyPassw0rd
    
    确认能正常列出证书、私钥条目,无格式错误。
  • 若MQ偏好PKCS12,将JKS转换为PKCS12格式并更新配置:
    keytool -importkeystore -srckeystore key.jks -destkeystore key.p12 -srcstoretype JKS -deststoretype PKCS12
    
    配置修改为:
    ibm.mq.jks.trust-store=classpath:key.p12
    ibm.mq.jks.trust-store-password=keyPassw0rd
    ibm.mq.jks.key-store=classpath:key.p12
    ibm.mq.jks.key-store-password=keyPassw0rd
    ibm.mq.jks.key-store-type=PKCS12
    ibm.mq.jks.trust-store-type=PKCS12
    

3. TLS版本与密码套件不兼容

配置的ANY_TLS13_OR_HIGHER可能与MQ服务器端支持的套件不匹配,或JDK版本不支持该套件名称。

解决办法:

  • 替换为双方都支持的具体TLS1.3套件,比如TLS_AES_256_GCM_SHA384,先确认MQ服务器已启用对应套件。
  • 检查JDK版本:JDK 11及以上默认支持TLS1.3,JDK 8需升级到u261及以上版本。

4. 文件权限问题

即使JKS文件存在,应用进程可能没有读取权限,尤其是容器化部署场景。

解决办法:

  • 检查target目录下key.jks的权限,确保应用运行用户有读取权限:
    ls -l target/key.jks
    
  • 容器环境中,在Dockerfile添加权限设置:
    RUN chmod 644 /app/key.jks
    

内容的提问来源于stack exchange,提问作者zleek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 03:35:41