Hi folks,
Trying to debug a tricky problem, and I'm beginning to suspect it's a
bug in the ActiveMQ server and/or client. The client sometimes ends up
using a wrong truststore, in spite of seemingly correct configuration.
Server: 2.31.0
Client: 2.38 (via Spring Boot)
The client is connecting to the server with the following connection
string:
(tcp://server1.example.com:61616,tcp://server1.example.com:61616)?sslEnabled=true&trustStorePath=/path/to/truststore.jks&trustStorePassword=foobar
The client manages to connect to Server 1 and is able to consume and
produce messages, this is fine.
However, the server seems to broadcast a topology update
(ClusterTopologyChangeMessage_V4) containing the following:
?port=61616&keyStorePassword=****&sslEnabled=true&host=server1-example-com&keyStorePath=/path/to/broker-ks&verifyHostName=false
and
?port=61616&keyStorePassword=****&sslEnabled=true&host=server2-example-com&keyStorePath=/path/to/broker-ks&verifyHostName=false
The client then seems to attempt to connect to Server 2 using the path
to the keystore provided in the ClusterTopologyChangeMessage, instead of
the the path I configured in the client connection string ???
I don't understand why this is happening. In fact, I don't even
understand why the server would broadcast the path to its own keystore
(and apparently also its password?) to clients. This information is
useless to the client, and it makes no sense for the client to attempt
to use this nonexistent path as a truststore.
We're using Spring Boot, so I'm not 100% certain that the problem isn't
with Spring, but as far as I can tell the correct connection string is
passed to a connection factory, and then somehow it ends up using a
wrong path to a truststore anyway.
The end result is that while things seem to work fine, the log is full
of errors (java.lang.Exception: Failed to find a store at
/path/to/broker.ks). Full stack trace at the bottom of the message.
Presumably things will stop working when we attempt to fail over to
Server 2.
Could someone be so kind as to point me in the right direction for
getting to the bottom of this?
Thanks,
Elric
Full stacktrace:
java.lang.Exception: Failed to find a store at /path/to/broker.ks
at
org.apache.activemq.artemis.core.remoting.impl.ssl.SSLSupport.validateStoreURL(SSLSupport.java:399)
~[artemis-core-client-2.28.0.jar!/:2.28.0]
at
org.apache.activemq.artemis.core.remoting.impl.ssl.SSLSupport.loadKeystore(SSLSupport.java:339)
~[artemis-core-client-2.28.0.jar!/:2.28.0]
at
org.apache.activemq.artemis.core.remoting.impl.ssl.SSLSupport.loadKeyManagerFactory(SSLSupport.java:375)
~[artemis-core-client-2.28.0.jar!/:2.28.0]
at
org.apache.activemq.artemis.core.remoting.impl.ssl.SSLSupport.loadKeyManagers(SSLSupport.java:355)
~[artemis-core-client-2.28.0.jar!/:2.28.0]
at
org.apache.activemq.artemis.core.remoting.impl.ssl.SSLSupport.createContext(SSLSupport.java:222)
~[artemis-core-client-2.28.0.jar!/:2.28.0]
at
org.apache.activemq.artemis.core.remoting.impl.ssl.DefaultSSLContextFactory.getSSLContext(DefaultSSLContextFactory.java:50)
~[artemis-core-client-2.28.0.jar!/:2.28.0]
at
org.apache.activemq.artemis.core.remoting.impl.netty.NettyConnector.loadJdkSslEngine(NettyConnector.java:786)
~[artemis-core-client-2.28.0.jar!/:2.28.0]
at
org.apache.activemq.artemis.core.remoting.impl.netty.NettyConnector$1.initChannel(NettyConnector.java:690)
~[artemis-core-client-2.28.0.jar!/:2.28.0]
at
io.netty.channel.ChannelInitializer.initChannel(ChannelInitializer.java:129)
~[netty-transport-4.1.97.Final.jar!/:4.1.97.Final]
at
io.netty.channel.ChannelInitializer.handlerAdded(ChannelInitializer.java:112)
~[netty-transport-4.1.97.Final.jar!/:4.1.97.Final]
at
io.netty.channel.AbstractChannelHandlerContext.callHandlerAdded(AbstractChannelHandlerContext.java:1114)
~[netty-transport-4.1.97.Final.jar!/:4.1.97.Final]
at
io.netty.channel.DefaultChannelPipeline.callHandlerAdded0(DefaultChannelPipeline.java:609)
~[netty-transport-4.1.97.Final.jar!/:4.1.97.Final]
at
io.netty.channel.DefaultChannelPipeline.access$100(DefaultChannelPipeline.java:46)
~[netty-transport-4.1.97.Final.jar!/:4.1.97.Final]
at
io.netty.channel.DefaultChannelPipeline$PendingHandlerAddedTask.execute(DefaultChannelPipeline.java:1463)
~[netty-transport-4.1.97.Final.jar!/:4.1.97.Final]
at
io.netty.channel.DefaultChannelPipeline.callHandlerAddedForAllHandlers(DefaultChannelPipeline.java:1115)
~[netty-transport-4.1.97.Final.jar!/:4.1.97.Final]
at
io.netty.channel.DefaultChannelPipeline.invokeHandlerAddedIfNeeded(DefaultChannelPipeline.java:650)
~[netty-transport-4.1.97.Final.jar!/:4.1.97.Final]
at
io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:514)
~[netty-transport-4.1.97.Final.jar!/:4.1.97.Final]
at
io.netty.channel.AbstractChannel$AbstractUnsafe.access$200(AbstractChannel.java:429)
~[netty-transport-4.1.97.Final.jar!/:4.1.97.Final]
at
io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:486)
~[netty-transport-4.1.97.Final.jar!/:4.1.97.Final]
at
io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174)
~[netty-common-4.1.97.Final.jar!/:4.1.97.Final]
at
io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167)
~[netty-common-4.1.97.Final.jar!/:4.1.97.Final]
at
io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)
~[netty-common-4.1.97.Final.jar!/:4.1.97.Final]
at
io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:416)
~[netty-transport-classes-epoll-4.1.97.Final.jar!/:4.1.97.Final]
at
io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
~[netty-common-4.1.97.Final.jar!/:4.1.97.Final]
at
io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
~[netty-common-4.1.97.Final.jar!/:4.1.97.Final]
at
org.apache.activemq.artemis.utils.ActiveMQThreadFactory$1.run(ActiveMQThreadFactory.java:118)
~[artemis-commons-2.28.0.jar!/:na]