Настройка работы сервисов Оркестратора с RabbitMQ через SSL
Данная статья содержит следующие подразделы:
- Заведение OpenSSL сертификатов для работы через SSL.
- Настройка RabbitMQ на Linux для работы через SSL.
- Настройка RabbitMQ на Windows для работы через SSL.
- Настройка сервисов оркестратора для работы с RabbitMQ через SSL.
- Полезные ссылки.
Заведение OpenSSL сертификатов для работы через SSL
- Устанавливаем OpenSSL либо с официального сайта , либо используем ту версию, что идет в составе одной из утилит (например, можно использовать ту, которая идет в составе git).
- Для того, чтобы в скриптах каждый раз не использовать полный путь к файлу openssl.exe, рекомендуется добавить этот путь в настройки системной переменной Path (если же вы предпочитаете работать через PowerShell, а не через командную строку, и не желаете изменять системную переменную Path, то можно использовать сеансовые алиасы).
- Далее в данном руководстве предполагается, что полный путь прописан в системной переменной Path.
- Прописать путь в Path, если вы работаете в Windows, можно таким образом: Открываем указанное ниже диалоговое окно (и далее выбираем соответствующие вкладки / нажимаем указанные кнопки / выбираем указанные строки из списков):
- В нерусифицированной версии Windows:
System Properties > Advanced > Environment Variables… > System variables > Path > Edit… > New > [Тут указываем полный путь к файлу openssl.exe]: - В русской версии Windows:
Свойства системы > Дополнительно > Переменные среды… > Системные переменные > Path > Изменить… > Создать > [Тут указываем полный путь к файлу openssl.exe]:



- Далее создаем каталог, в котором будут размещаться как сами сертификаты, так и необходимые для их создания файлы, и переходим в него.
- RabbitMQ должен при запуске иметь доступ к корневому сертификату СА, сертификату сервера и приватному ключу сертификата сервера. Создадим эти файлы.
- Первым делом создаем корневой ключ CA и затем создаем корневой сертификат CA.
Для этого открываем командную строку и выполняем в ней такие 2 команды:
openssl genrsa -out RMQ-CA-Key.pem
openssl req -new -key RMQ-CA-Key.pem -x509 -days 10000 -out RMQ-CA-cert.pemЗаполняем необходимые поля для сертификата. Имена выбираем произвольно. На этом корневой сертификат CA создан.
- Генерируем ключ для сервера:
openssl genrsa -out RMQ-server-key.pem 2048- Теперь создаем запрос на сертификат сервера.
openssl req -new -key RMQ-server-key.pem -out RMQ-signingrequest.csrПри заполнении полей, в поле Common Name важно указать имя сервера: домен или IP адрес сервера (например, домен: db.example.com или IP-адрес: 192.168.0.116): 10. Генерируем самоподписанный x509-сертификат сервера используя запрос на сертификат сервера, сертификат СА и ключ сертификата СА:
openssl x509 -req -days 1000 -in RMQ-signingrequest.csr -CA RMQ-CA-cert.pem -CAkey RMQ-CA-Key.pem -CAcreateserial -out RMQ-server-cert.pem- Теперь таким же образом (как описано в трех предыдущих пунктах) создаем связку ключ-сертификат для клиента. Имена файлов соответствующим образом меняем (например:
RMQ-client-key.pem,RMQ-client-signingrequest.csr,RMQ-client-cert.pem):
openssl genrsa -out RMQ-client-key.pem 2048
openssl req -new -sha256 -key RMQ-client-key.pem -out RMQ-client-signingrequest.csr
openssl x509 -req -days 1000 -in RMQ-client-signingrequest.csr -CA RMQ-CA-cert.pem -CAkey RMQ-CA-Key.pem -CAcreateserial -out RMQ-client-cert.pemПри заполнении полей сертификата клиента, в поле Common Name указываем логин, под которым будет выполняться подключение к RabbitMQ (по умолчанию для сервисов Оркестратора это имя: admin – далее во всех скриптах в этом руководстве подразумевается, что было задано именно такое имя для этого параметра).
12. Для работы с RabbitMQ клиентам требуется специальный тип сертификата PKCS12, создаем его такой командой:
openssl pkcs12 -export -out client-identity.p12 -inkey RMQ-client-key.pem -in RMQ-client-cert.pem- При этом запоминаем (записываем) парольную фразу, требуемую для данного типа сертификатов. Она нам пригодится в дальнейшем при конфигурировании работы сервисов Оркестратора.
- В итоге, в нашей рабочей папке должно быть 10 таких файлов:

- Теперь переходим к настройке RabbitMQ и сервисов Оркестратора для работы через SSL, как описано далее в настоящем руководстве
Настройка RabbitMQ на Linux для работы через SSL
- Копируем корневой сертификат CA, ключ и сертификат сервера (созданные ранее в п.1. настоящего руководства) в удобный для вас каталог (допустим, он расположен по такому пути:
/etc/pki/tls). - В итоге, в этом каталоге должны быть установлены указанные выше файлы с такими правами:

- Теперь переходим к правке файла конфигурации RabbitMQ. Он должен быть собран с поддержкой SSL/TLS. Этот файл может по-разному именоваться и может иметь разное расширение.
- Расположение всех конфигурационых файлов можно найти, запустив в командной строке команду:
rabbitmq-diagnostics statusКонфигурационные файлы будут перечислены в секции Config files:

- Расположение конфигурационных файлов также можно найти, если кликнуть по кнопке с названием текущего узла в RabbitMQ management UI (в примере, показанном на картинке, следует кликнуть по кнопке с наименованием rabbit@astra-linux):


- Если конфигурационный файл имеет расширение *.config, то изменяем его в соответствии с описанием по настройке SSL в RabbitMQ для операционной системы Windows данного руководства.
- Если этот файл имеет расширение *.conf, то для работы RabbitMQ через SSL/TLS вносим в него такие строки, подставив актуальные пути к сертификатам и ключу:

Если нам необходимо, чтобы RabbitMQ работал исключительно только через SSL/TLS, то следует внести в конфигурационный файл такие строки:

В нашем случае эта секция конфигурационного файла выглядит таким образом:

- Следующий шаг: необходимо активировать встроенный в RabbitMQ плагин для аутентификации через SSL. Сделать это можно, выполнив в командной строке такую команду:
rabbitmq-plugins enable rabbitmq_auth_mechanism_ssl- После этого необходимо перезагрузить сервис RabbitMQ. Сделать это можно, выполнив в командной строке такие 2 команды:
rabbitmq-service stop
rabbitmq-service start- Теперь проверяем, что мы все сделали правильно, и сервис RabbitMQ может работать через SSL/TLS. Запускаем RabbitMQ management UI и проверяем, что запущен SSL-порт 5671

Затем, кликнув по кнопке с названием текущего узла, проверяем, что запущен плагин для работы через SSL и включен механизм аутентификации EXTERNAL:


Настройка RabbitMQ на Windows для работы через SSL
- Копируем корневой сертификат CA, ключ и сертификат сервера (созданные ранее в п.1. настоящего руководства) в удобный для Вас каталог (допустим, он расположен по такому пути:
C:/tmp/certs). - В итоге, в этом каталоге должны быть установлены указанные выше файлы:

- Теперь переходим к правке файла конфигурации RabbitMQ. Он должен быть собран с поддержкой SSL/TLS. Этот файл может по-разному именоваться и может иметь разное расширение.
- Расположение всех конфигурационых файлов можно найти, запустив в командной строке команду:
rabbitmq-diagnostics statusКонфигурационные файлы будут перечислены в секции Config files:

- Расположение конфигурационных файлов также можно найти, если кликнуть по кнопке с названием текущего узла в RabbitMQ management UI (в примере, показанном на картинке, следует кликнуть по кнопке с наименованием rabbit@Victor-PC):


- Если конфигурационный файл имеет расширение *.conf, то изменяем его в соответствии с описанием по настройке SSL в RabbitMQ для операционной системы Linux данного руководства.
- Если этот файл имеет расширение *.config, то для работы RabbitMQ через SSL/TLS вносим в него такие строки, подставив актуальные пути к сертификатам и ключу:

Если нам необходимо, чтобы RabbitMQ работал исключительно только через SSL/TLS, то следует внести в конфиг такие строки:

- Следующий шаг: необходимо активировать встроенный в RabbitMQ плагин для аутентификации через SSL. Сделать это можно, выполнив в командной такую команду:
rabbitmq-plugins enable rabbitmq_auth_mechanism_ssl- После этого необходимо перезагрузить сервис RabbitMQ. Сделать это можно, выполнив в командной строке с правами администратора такие 2 команды:
rabbitmq-service stop
rabbitmq-service start- Теперь проверяем, что мы все сделали правильно, и сервис RabbitMQ может работать через SSL/TLS. Запускаем RabbitMQ management UI и проверяем, что запущен SSL-порт 5671:

Затем, кликнув по кнопке с названием текущего узла, проверяем, что запущен плагин для работы через SSL и включен механизм аутентификации EXTERNAL:


Настройка сервисов Оркестратора для работы с RabbitMQ через SSL
- Копируем специальный тип сертификата PKCS12 (созданный ранее в п.1. настоящего руководства) в удобный для вас каталог на машине, где развернут требуемый сервис Оркестратора.
- Далее меняем конфигурационный файл сервиса (файл appsettings.ProdWin.json для машин семейства Windows, или appsettings.ProdLinux.json для машин семейства Linux). Для этого изменяем секцию RabbitMQ конфигурационного файла таким образом:
- Для параметра
Portуказываем значение5671. - Для параметра
UseSslуказываем значениеtrue. - Для параметра
SslServerNameуказываем имя сервера, которое было указано в сертификате сервера для RabbitMQ (см. п.1. данного руководства). - Для параметра
SslCertPathуказываем полный путь и имя клиентского сертификата PKCS12. - Для параметра
SslCertPassphraseуказываем парольную фразу, которую мы задали для сертификата PKCS12, когда его создавали (см. п.1. данного руководства).
- Например, для машин с ОС Windows эти секции конфигурационнго файла могут выглядеть так:

- Эти же секции конфигурационного файла для машин с ОС Linux могут выглядеть так:

- Перед тем как запустить сервис Оркестратора, рекомендуется выставить в конфигурационном файле этого сервиса уровень логирования в Information, это поможет быстрее разобраться с возможными проблемами при его некорректном запуске.
Например, как показано в данном случае:

- Если все сконфигурировано корректно, то после запуска сервиса в его логах отобразится запись, что коннект с RabbitMQ установлен:

При этом в RabbitMQ management UI на вкладке Connections можно будет увидеть вновь созданный коннект:

И если кликнуть по названию этого коннекта, то можно получить его детальные характеристики:

- Если же в конфигурационном файле сервиса что-то не устроит RabbitMQ, то в логах будет отображена детальная информация о том, что конкретно не так, как требуется.
Например, вот что будет в логах, если в конфигурационном файле указан сертификат, подписанный каким-либо другим центром сертификации:

Или вот что будет в логах, если в конфигурационном файле указана некорректная парольная фраза для сертификата:

- Если возникли совсем непонятные проблемы с SSL-сертификатом, то также будет полезно посмотреть логи самого RabbitMQ. Расположение этих логов можно узнать из RabbitMQ management UI, кликнув по названию текущего узла:

Использование виртуальных хостов RabbitMQ
Доступно с версии Оркестратора 1.25.7
Начиная с версии 1.25.7 Orchestrator поддерживает использование виртуальных хостов (Virtual Hosts) в RabbitMQ. Эта функция позволяет нескольким экземплярам Оркестратора подключаться к одному серверу RabbitMQ, работая при этом в полностью изолированных пространствах.
Поддержка виртуальных хостов добавлена в следующие сервисы Оркестратора:
AnalyticLogEventsWebhookNotificationsRobotLogsStatesWebApi
Настройка виртуальных хостов
- Создайте новый виртуальный хост через административный UI RabbitMQ.

- Настройка прав доступа. Для созданного виртуального хоста добавьте пользователя и назначьте ему права доступа (как минимум, разрешения на чтение, запись и конфигурацию).

- В конфигурационных файлах (
appsettings.json) для каждого из перечисленных сервисов необходимо в секцииRabbitMQуказать параметрVirtualHost:

{
"RabbitMQ": {
"HostName": "your-rabbitmq-server",
"VirtualHost": "your_virtual_host_name",
"UserName": "your_username",
"Password": "your_password"
}
}- После внесения изменений в конфигурационные файлы перезапустите все обновленные сервисы Оркестратора.
Полезные ссылки
- Сайт OpenSSL
- Документация по сетевым настройкам RabbitMQ (включая SSL/TLS, на английском языке)
- Документация по настройкам TLS в RabbitMQ (на английском языке)
- Описание кодов ошибок при работе с SSL/TLS (на английском языке)
- Описание параметров rabbitmq.conf (на английском языке)
- Описание механизма аутентификации с использованием x509 (TLS/SSL) сертификатов для RabbitMQ (на английском языке)
- Реализация аутентификации RabbitMQ с использованием SSL/TLS по стандарту .NET Standard 2.1 (на английском языке)