Spring JMS生产者通过SSL连接Artemis MQ失败出现信任库路径异常
你开启HA模式后,ActiveMQ Artemis集群会将broker.xml中配置的所有connector信息作为集群拓扑推送给已连接的客户端。客户端后续连接集群其他节点时,会优先使用拓扑中connector URL附带的所有参数,包括你硬编码在服务端connector里的trustStorePath、trustStorePassword等SSL配置,直接覆盖你在客户端连接URL中配置的全局SSL参数。
服务端connector里写的/home/artemis_certs/xxx/client_ts.p12是Broker服务器本地的路径,客户端机器上不存在该路径,因此会抛出找不到信任库的错误。集群节点之间通信正常是因为这些路径在Broker服务器上真实存在。
两种方案二选一即可:
方案1:修改服务端配置(推荐,适配所有客户端)
将服务端broker.xml中所有connector URL里的SSL配置(trustStorePath、trustStorePassword、keyStorePath、keyStorePassword)移除,统一放到broker的全局SSL配置段中,配置示例如下:
<core xmlns="urn:activemq:core"> <!-- 新增全局SSL配置,供集群内部通信使用 --> <ssl> <key-store path="/home/artemis_certs/${broker.name}/broker_ks.p12" password="keyStorePassword"/> <trust-store path="/home/artemis_certs/${broker.name}/client_ts.p12" password="trustStorePassword"/> </ssl> <connectors> <!-- 移除每个connector里的SSL路径、密码参数,仅保留sslEnabled=true --> <connector name="amq1-master">tcp://amq1:61616?sslEnabled=true</connector> <connector name="amq1-slave">tcp://amq2:61616?sslEnabled=true</connector> <!-- 其余connector同理修改 --> </connectors> <!-- 其余配置保持不变 --> </core>
修改后重启所有Broker节点,推送的拓扑信息就不会携带服务端的证书路径,客户端会使用自身配置的SSL参数连接所有节点。
方案2:修改客户端配置(无需改动服务端,快速生效)
在客户端的JMS连接URL末尾新增参数useTopologyForSSL=false,强制客户端忽略集群拓扑推送的SSL配置,始终使用客户端自身配置的SSL参数连接所有节点,修改后的URL示例:
jms.artemis.broker.url=(tcp://amq1:61616,tcp://amq2:61616,tcp://amq3:61616,tcp://amq4:61616,tcp://amq5:61616,tcp://amq6:61616)?ha=true&sslEnabled=true&trustStorePath=/home/cert/client_ts.p12&trustStorePassword=trustStorePassword&keyStorePath=/home/cert/broker_ks.p12&keyStorePassword=keyStorePassword&useTopologyForSSL=false
修改后确认客户端/home/cert/client_ts.p12已导入所有6个Broker节点的证书公钥,密码配置正确即可。
内容的提问来源于stack exchange,提问作者LDropl

