如何在ActiveMQ Artemis集群中配置SSL及排查握手报错
错误根因
你当前配置中acceptor添加了needClientAuth=true参数,该参数会强制开启TLS双向认证,要求所有连接到该acceptor的客户端(包含集群中其他节点的connector)都必须提交客户端证书,但你当前的connector仅配置了truststore未配置keystore,无法提供客户端证书,因此触发Empty client certificate chain握手错误。
配置规则说明
两种TLS认证模式的配置规则如下:
- 单向TLS认证(仅客户端校验服务端身份,符合你的使用场景)
- acceptor仅需配置keystore(存储服务端自身的证书和私钥),无需开启客户端认证参数
- connector仅需配置truststore(存储受信任的服务端CA证书,用于校验对端服务端证书合法性),无需配置keystore
- 双向TLS认证
- acceptor需配置keystore,开启
needClientAuth=true,同时配置truststore(存储受信任的客户端CA证书,用于校验客户端提交的证书) - connector需同时配置truststore(校验服务端证书)和keystore(存储自身客户端证书,用于提交给服务端认证)
- acceptor需配置keystore,开启
正确配置方案
你不需要双向认证,直接删除两个节点acceptor配置中的needClientAuth=true即可,其余配置保持不变即可正常运行。
修改后的配置示例:
Server1
<connectors> <connector name="netty-connector">tcp://server1:61616?enabledProtocols=TLSv1.2;sslEnabled=true;trustStorePath=client-ca-truststore.jks;trustStorePassword=securepass</connector> </connectors> <acceptors> <acceptor name="artemis">tcp://0.0.0.0:61616?protocols=CORE,AMQP,STOMP,HORNETQ,OPENWIRE;sslEnabled=true;keyStorePath=server1-keystore.jks;keyStorePassword=securepass</acceptor> </acceptors>
Server2
<connectors> <connector name="netty-connector">tcp://server2:61616?enabledProtocols=TLSv1.2;sslEnabled=true;trustStorePath=client-ca-truststore.jks;trustStorePassword=securepass</connector> </connectors> <acceptors> <acceptor name="artemis">tcp://0.0.0.0:61616?protocols=CORE,AMQP,STOMP,HORNETQ,OPENWIRE;sslEnabled=true;keyStorePath=server2-keystore.jks;keyStorePassword=securepass</acceptor> </acceptors>
补充注意事项
你使用的client-ca-truststore.jks需要同时导入Server1和Server2自签名证书的公钥,确保两个节点的connector可以正常验证对端acceptor的证书合法性。
另外needClientAuth是TLS层的证书认证开关,和业务层的用户名密码认证互相独立,开启该参数后无论是否配置用户名密码,都会强制要求客户端提交TLS证书。
内容的提问来源于stack exchange,提问作者skin27
相关产品推荐
相关产品推荐

