Настройка работы сервисов Оркестратора с 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, кликнув по названию текущего узла:
Полезные ссылки
- Сайт OpenSSL
- Документация по сетевым настройкам RabbitMQ (включая SSL/TLS, на английском языке)
- Документация по настройкам TLS в RabbitMQ (на английском языке)
- Описание кодов ошибок при работе с SSL/TLS (на английском языке)
- Описание параметров rabbitmq.conf (на английском языке)
- Описание механизма аутентификации с использованием x509 (TLS/SSL) сертификатов для RabbitMQ (на английском языке)
- Реализация аутентификации RabbitMQ с использованием SSL/TLS по стандарту .NET Standard 2.1 (на английском языке)