Пароль маски в URL-адресе подключения ActiveMQ

#java #spring-jms #activemq-artemis

Вопрос:

Я использую JMS в клиенте Spring boot для подключения к брокеру ActiveMQ Artemis 2.19.0 по протоколу SSL.

В broker.xml я использую пароли-маски, например ENC(32c6f67da12342b0a7ad1702033aa81e6b2a760123f4360) , вместо обычного текста, и он работает нормально.

Я попытался использовать тот же пароль маски вместо обычного текста в моем URL-адресе подключения ActiveMQ, как в приведенном ниже коде, но это не сработало. Я использую эту команду для маскировки пароля:

 ./artemis mask <plaintextPassword>
 

Обычный текстовый пароль работает.

Вот мой код для настройки фабрики соединений:

 ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(
        "(tcp://amq:61616)?"  
                "sslEnabled=true"  
                "amp;trustStorePath="   trustStorePath   "amp;trustStorePassword=ENC(397e3aeeddf27c9783a3ab920d83e24da5b7d710df3b405f)"
);
 

Ошибка, которую я получаю:

 
2021-10-27 13:10:15.243  WARN 17748 --- [-netty-threads)] io.netty.channel.ChannelInitializer      : Failed to initialize a channel. Closing: [id: 0x07b0d96b]

java.io.IOException: keystore password was incorrect
        at java.base/sun.security.pkcs12.PKCS12KeyStore.engineLoad(PKCS12KeyStore.java:2116) ~[na:na]
        at java.base/sun.security.util.KeyStoreDelegator.engineLoad(KeyStoreDelegator.java:243) ~[na:na]
        at java.base/java.security.KeyStore.load(KeyStore.java:1479) ~[na:na]
        at org.apache.activemq.artemis.core.remoting.impl.ssl.SSLSupport.loadKeystore(SSLSupport.java:224) ~[artemis-core-client-2.6.4.jar!/:2.6.4]
        at org.apache.activemq.artemis.core.remoting.impl.ssl.SSLSupport.loadTrustManagerFactory(SSLSupport.java:166) ~[artemis-core-client-2.6.4.jar!/:2.6.4]
        at org.apache.activemq.artemis.core.remoting.impl.ssl.SSLSupport.loadTrustManager(SSLSupport.java:195) ~[artemis-core-client-2.6.4.jar!/:2.6.4]
        at org.apache.activemq.artemis.core.remoting.impl.ssl.SSLSupport.createContext(SSLSupport.java:99) ~[artemis-core-client-2.6.4.jar!/:2.6.4]
        at org.apache.activemq.artemis.core.remoting.impl.netty.NettyConnector.loadJdkSslEngine(NettyConnector.java:624) ~[artemis-core-client-2.6.4.jar!/:2.6.4]
        at org.apache.activemq.artemis.core.remoting.impl.netty.NettyConnector.access$500(NettyConnector.java:124) ~[artemis-core-client-2.6.4.jar!/:2.6.4]
        at org.apache.activemq.artemis.core.remoting.impl.netty.NettyConnector$1.initChannel(NettyConnector.java:532) ~[artemis-core-client-2.6.4.jar!/:2.6.4]
        at io.netty.channel.ChannelInitializer.initChannel(ChannelInitializer.java:129) ~[netty-transport-4.1.39.Final.jar!/:4.1.39.Final]
        at io.netty.channel.ChannelInitializer.handlerAdded(ChannelInitializer.java:112) ~[netty-transport-4.1.39.Final.jar!/:4.1.39.Final]
        at io.netty.channel.AbstractChannelHandlerContext.callHandlerAdded(AbstractChannelHandlerContext.java:964) ~[netty-transport-4.1.39.Final.jar!/:4.1.39.Final]
        at io.netty.channel.DefaultChannelPipeline.callHandlerAdded0(DefaultChannelPipeline.java:610) ~[netty-transport-4.1.39.Final.jar!/:4.1.39.Final]
        at io.netty.channel.DefaultChannelPipeline.access$100(DefaultChannelPipeline.java:46) ~[netty-transport-4.1.39.Final.jar!/:4.1.39.Final]
        at io.netty.channel.DefaultChannelPipeline$PendingHandlerAddedTask.execute(DefaultChannelPipeline.java:1474) ~[netty-transport-4.1.39.Final.jar!/:4.1.39.Final]
        at io.netty.channel.DefaultChannelPipeline.callHandlerAddedForAllHandlers(DefaultChannelPipeline.java:1126) ~[netty-transport-4.1.39.Final.jar!/:4.1.39.Final]
        at io.netty.channel.DefaultChannelPipeline.invokeHandlerAddedIfNeeded(DefaultChannelPipeline.java:651) ~[netty-transport-4.1.39.Final.jar!/:4.1.39.Final]
        at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:503) ~[netty-transport-4.1.39.Final.jar!/:4.1.39.Final]
        at io.netty.channel.AbstractChannel$AbstractUnsafe.access$200(AbstractChannel.java:416) ~[netty-transport-4.1.39.Final.jar!/:4.1.39.Final]
        at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:475) ~[netty-transport-4.1.39.Final.jar!/:4.1.39.Final]
        at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163) ~[netty-common-4.1.39.Final.jar!/:4.1.39.Final]
        at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:416) ~[netty-common-4.1.39.Final.jar!/:4.1.39.Final]
        at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:331) ~[netty-transport-native-epoll-4.1.39.Final-linux-x86_64.jar!/:4.1.39.Final]
        at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:918) ~[netty-common-4.1.39.Final.jar!/:4.1.39.Final]
        at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.39.Final.jar!/:4.1.39.Final]
        at org.apache.activemq.artemis.utils.ActiveMQThreadFactory$1.run(ActiveMQThreadFactory.java:118) ~[artemis-commons-2.6.4.jar!/:2.6.4]
Caused by: java.security.UnrecoverableKeyException: failed to decrypt safe contents entry: javax.crypto.BadPaddingException: Given final block not properly padded. Such issues can arise if a bad key is used during decryption.
        ... 27 common frames omitted
 

Может ли быть другой способ использовать пароль маски вместо обычного текста в URL-адресе подключения?

Комментарии:

1. Я пробовал использовать аналогичный URL-адрес, кодирующий пароль trustStorePassword, и это сработало. Какую ошибку вы получаете?

2. Я обновил свой пост журналом ошибок

3. Работает ли текстовый пароль 0etjq234NCTgBxP8dc4 ? Какую версию клиента artemis вы используете?

4. да, обычный текстовый пароль работает. Я использую Artemis-2.19.0

5. Я только что попробовал это сам, быстро изменив ssl-enabled пример, поставляемый с брокером, и все заработало. Пароль с маской был снят и использован, как ожидалось. Какую именно команду вы используете для маскировки пароля?

Ответ №1:

Клиент ActiveMQ Artemis не поддерживает зашифрованные пароли в составных URL (tcp://amq:61616)? -адресах, см. ARTEMIS-3543. Обходной путь заключается в том, чтобы избежать фрагментов, т.е.

 ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(
    "tcp://amq:61616?"  
            "sslEnabled=true"  
            "amp;trustStorePath="   trustStorePath   "amp;trustStorePassword=ENC(397e3aeeddf27c9783a3ab920d83e24da5b7d710df3b405f)"
);
 

Комментарии:

1. Это работает, но если у меня есть несколько брокеров, таких как «tcp: // amq1: 61616, tcp: // amq2: 61616? …», это все равно не работает. Я вижу, что проблема связана с этим случаем

2. @LDropl вы можете добавить другие пары хост / порт в конце после # , т.е. tcp://amq:61616?sslEnabled=trueamp;trustStorePath=truststore.jksamp;trustStorePassword=securepass#tcp://amq2:61616,tcp://amq3:61616