Аутентификация по сертификату в веб консоль ActiveMQ Artemis

В мире SSH аутентификация по открытому ключу используется очень широко. Напротив, для веб приложений такое решение применяется редко, но иногда бывает востребованно. В этой статье рассмотрим настройку веб консоли ActiveMQ Artemis для аутентификации пользователей по сертификату.

Начнём, пожалуй...

Скачиваем и распаковываем artemis.
(https://activemq.apache.org/components/artemis/download/)

Переходим в apache-artemis-x.x.x/bin и создаём новый экземпляр брокера:

artemis create broker01 --require-login --user entaxy --password entaxy --http-port 8443 --ssl-key ${artemis.instance}/etc/server.p12 --ssl-key-password server1234 --use-client-auth --ssl-trust ${artemis.instance}/etc/server.p12 --ssl-trust-password server1234

(для удобства поддержки/бэкапирования промышленной или любой серверной установке удобнее создавать брокер рядом с инсталлятором командой: artemis create ../../broker01 и далее остальные параметры)

Далее переходим в apache-artemis-x.x.x/bin/broker01/etc и все дальнейшие манипуляции производим в этой директории.

Если экземпляр брокера у Вас уже есть, то надо в конфиге включить поддержку HTTPS и клиентской аутентификации.
Для этого открываем bootstrap.xml и добавляем настройку HTTPS с указанием хранилища ключей, доверенного хранилища сертификатов и включенной аутентификацией клиента:

<web bind="https://localhost:8443" path="web" keyStorePath="${artemis.instance}/etc/server.p12" keyStorePassword="server1234" trustStorePath="${artemis.instance}/etc/server.p12" trustStorePassword="server1234" clientAuth="true"> <app url="activemq-branding" war="activemq-branding.war"/>

    <app url="artemis-plugin" war="artemis-plugin.war"/>

    <app url="console" war="console.war"/>

</web>

Далее необходимо создать пары ключей для сервера и для клиента.

Создаём хранилище ключей для сервера:

keytool -genkeypair -keyalg RSA -keysize 2048 -validity 3650 -alias serverKey -storepass server1234 -keypass server1234 -keystore server.p12 -deststoretype pkcs12 -dname "CN=artemis" -ext "SAN:c=DNS:localhost,IP:127.0.0.1"

Создаём хранилище ключей для клиента (в нашем случае для браузера):

keytool -genkeypair -keyalg RSA -keysize 2048 -validity 3650 -alias clientkey -storepass client1234 -keypass client1234 -keystore client.p12 -deststoretype pkcs12 -dname "CN=admin, OU=integration, O=emdev, C=ru"

Выгружаем публичный ключ клиента в отдельный файл:

keytool -export -rfc -keystore client.p12 -storepass client1234 -alias clientkey -file client.cer

И сохраняем этот ключ в доверенном хранилище сервера (в нашем случае это то же хранилище ключей - server.p12, но может быть и в отдельном хранилище):

keytool -import -trustcacerts -keystore server.p12 -storepass server1234 -alias clientkey -file client.cer

Проверяем DN клиентского сертификата:

keytool -printcert -file client.cer

Из вывода копируем значение поля Owner: CN=admin, OU=integration, O=emdev, C=ru

Открываем файл artemis-users.properties и меняем строчку entaxy = ENC(...) на

entaxy = CN=admin, OU=integration, O=emdev, C=ru

 

Открываем файл login.config, заменяем

activemq {
   org.apache.activemq.artemis.spi.core.security.jaas.PropertiesLoginModule required
       debug=false
       reload=true
       org.apache.activemq.jaas.properties.user="artemis-users.properties"
       org.apache.activemq.jaas.properties.role="artemis-roles.properties";
};

на

activemq {
   org.apache.activemq.artemis.spi.core.security.jaas.TextFileCertificateLoginModule required
       debug=true
       reload=true
       org.apache.activemq.jaas.textfiledn.user="cert-users.properties"
       org.apache.activemq.jaas.textfiledn.role="cert-roles.properties";
};

Можем запускать брокер

../bin/artemis run

..\bin\artemis run (для windows)

Остаётся загрузить клиентское хранилище ключей в браузер и перейти по адресу https://localhost:8443/console

Проверено на версии 2.19.1 и 2.32.0

 

Два модуля аутентификации.

При желании можно оставить PropertiesLoginModule и не менять пользователей в artemis-users.properties.

Для этого создаём новый файл cert-users.properties и вставляем туда произвольное имя и DN из сертификата:

entaxy = CN=admin, OU=integration, O=emdev, C=ru

Создаём файл cert-roles.properties и вставляем роль и имя из файла cert-users.properties:

amq = entaxy

Открываем файл login.config, заменяем required на sufficient для PropertiesLoginModule и добавляем новый модуль TextFileCertificateLoginModule:

activemq {
   org.apache.activemq.artemis.spi.core.security.jaas.PropertiesLoginModule sufficient
       debug=false
       reload=true
       org.apache.activemq.jaas.properties.user="artemis-users.properties"
       org.apache.activemq.jaas.properties.role="artemis-roles.properties";

   org.apache.activemq.artemis.spi.core.security.jaas.TextFileCertificateLoginModule sufficient
       debug=true
       reload=true
       org.apache.activemq.jaas.textfiledn.user="cert-users.properties"
       org.apache.activemq.jaas.textfiledn.role="cert-roles.properties";
};

Альтернативно можно в файле login.config создать новый realm (activemq-cert) с модулем TextFileCertificateLoginModule

activemq {
   org.apache.activemq.artemis.spi.core.security.jaas.PropertiesLoginModule required
       debug=false
       reload=true
       org.apache.activemq.jaas.properties.user="artemis-users.properties"
       org.apache.activemq.jaas.properties.role="artemis-roles.properties";
};
activemq-cert {
   org.apache.activemq.artemis.spi.core.security.jaas.TextFileCertificateLoginModule required
       debug=true
       reload=true
       org.apache.activemq.jaas.textfiledn.user="cert-users.properties"
       org.apache.activemq.jaas.textfiledn.role="cert-roles.properties";
};

И указать его имя в атрибуте certificate-domain тега jaas-security в файле bootstrap.xml:

<jaas-security domain="activemq" certificate-domain="activemq-cert"/>

 

Или в файле artemis.profile.cmd переопределить realm с -Dhawtio.realm=activemq на -Dhawtio.realm=activemq-cert

14.03.2024