Вопрос или проблема
В настоящее время я настраиваю кластер RabbitMQ, где требуется, чтобы все коммуникации внутри кластера были зашифрованы.
Я следовал руководству на https://www.rabbitmq.com/clustering-ssl.html – создал файл с сертификатом и ключом, и передал аргументы SSL в rabbitmq-server в виде переменных окружения:
RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS='-pa /usr/lib/erlang/lib/ssl-7.1/ebin -proto_dist inet_tls -ssl_dist_opt server_certfile /etc/ssl/certs/rabbit.pem'
RABBITMQ_CTL_ERL_ARGS='-pa /usr/lib/erlang/lib/ssl-7.1/ebin -proto_dist inet_tls -ssl_dist_opt server_certfile /etc/ssl/certs/rabbit.pem'
Сервер запускается нормально и слушает с включенным TLS, но я не могу выполнять никакие команды через rabbitmqctl:
# rabbitmqctl status
Статус узла rabbit@rabbit01 ...
Ошибка: невозможно подключиться к узлу rabbit@rabbit01: nodedown
ДИАГНОСТИКА
===========
попытка связаться: [rabbit@rabbit01]
rabbit@rabbit01:
* подключен к epmd (порт 4369) на rabbit01
* epmd сообщает, что узел 'rabbit' работает на порту 47965
* TCP соединение успешно, но распределение Erlang не удалось
* предложение: несоответствие имени хоста?
* предложение: правильно ли установлен cookie?
* предложение: использует ли распределение Erlang TLS?
С стороны сервера, я не получаю ничего существенно полезного в журналах, кроме крайне бесполезного:
=ОТЧЕТ ОБ ОШИБКЕ==== 30-Dec-2015::13:08:58 ===
SSL: hello: tls_handshake.erl:167:Фатальная ошибка: недостаточная безопасность
Небольшой поиск показал, что это может быть связано с несовпадением шифровых наборов, но я думал, что они оба должны использовать одну и ту же библиотеку SSL.
Erlang действительно имеет поддержку SSL, как проверено на https://www.rabbitmq.com/troubleshooting-ssl.html, и я могу установить безопасное соединение с сертификатом с помощью s_server и s_client от openssl.
Я не уверен, каков будет следующий шаг в диагностике этой проблемы и не смог найти каких-либо известных проблем с кластеризацией – к сожалению, большая часть документации RabbitMQ по поводу TLS касается протокола AMQP, а не внутренней кластеризации.
Я также тестировал подключение к работающему экземпляру RabbitMQ с помощью openSSL и получал очень похожую ошибку:
# openssl s_client -connect localhost:47965
CONNECTED(00000003)
140004605863584:error:1407742F:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert insufficient security:s23_clnt.c:770:
---
свидетельство соперника недоступно
---
Имя CA клиентского сертификата не отправлено
---
SSL рукопожатие прочитало 7 байт и записало 295 байт
---
Новый, (NONE), шифр (NONE)
Безопасная переаттестация НЕ поддерживается
Сжатие: НЕТ
Расширение: НЕТ
---
openssl s_client -connect localhost:47965 -tls1_2
CONNECTED(00000003)
140400037775008:error:1409442F:SSL routines:SSL3_READ_BYTES:tlsv1 alert insufficient security:s3_pkt.c:1262:SSL alert number 71
140400037775008:error:1409E0E5:SSL routines:SSL3_WRITE_BYTES:ssl handshake failure:s3_pkt.c:598:
---
свидетельство соперника недоступно
---
Имя CA клиентского сертификата не отправлено
---
SSL рукопожатие прочитало 7 байт и записало 0 байт
---
Новый, (NONE), шифр (NONE)
Безопасная переаттестация НЕ поддерживается
Сжатие: НЕТ
Расширение: НЕТ
SSL-сеанс:
Протокол : TLSv1.2
Шифр : 0000
ID-сеанса:
ID-контекста сеанса:
Основной ключ:
Аргумент ключа : Нет
Идентификатор PSK: Нет
Указатель идентификатора PSK: Нет
Имя пользователя SRP: Нет
Время начала: 1451944018
Таймаут : 7200 (сек)
Код возврата проверки: 0 (ок)
---
Это может быть связано с несовпадением шифрового набора или версии TLS (например, клиент ограничен TLSv1, но RabbitMQ настроен для требования TLSv1.2), но также может быть связано с тонкими полями использования ключа в сертификате. Последнее особенно трудно заметить.
Смотрите [1][2][3][4][5].
Ответ или решение
Ошибка RabbitMQ TLS: "Недостаточная безопасность" и способы её устранения
При настройке кластера RabbitMQ с использованием TLS для шифрования всех коммуникаций между узлами вы столкнулись с ошибкой "недостаточная безопасность". Ваша проблема скорее всего связана с неправильной конфигурацией шифрования или параметров сертификата. Рассмотрим более подробно, как это можно исправить.
1. Понимание ошибки
Сообщение об ошибке, которое вы получаете:
SSL: hello: tls_handshake.erl:167:Fatal error: insufficient security
указывает на проблему с параметрами TLS, где уровень безопасности, выставленный на стороне клиента или сервера, слишком низок. Это может произойти по следующим причинам:
- Неподдерживаемые шифры.
- Несоответствие между версиями TLS.
- Неправильные настройки сертификатов.
2. Проверка конфигурации
2.1 Версии TLS
Убедитесь, чтоRabbitMQ настроен на использование поддерживаемой версии TLS, например, TLS 1.2 или выше. Проверьте, что настройки на клиенте и сервере совпадают.
Добавьте параметры для ограничения используемых шифров и версий:
RABBITMQ_SSL_CIPHERS=ECDHE-RSA-AES256-GCM-SHA384
2.2 Шифры
Список поддерживаемых шифров можно проверить через OpenSSL. Вам необходимо убедиться, что как сервер, так и клиент используют один и тот же набор шифров. Проверьте параметры RabbitMQ:
RABBITMQ_SSL_CIPHERS=<your preferred ciphers>
2.3 Сертификаты
Ошибка может быть вызвана неправильными настройками сертификата. Убедитесь, что ваш ключ и сертификат корректны и имеют необходимые ключевыеUsage (например, для шифрования). Параметры должны включать:
- Digital Signature
- Key Encipherment
3. Проверка параметров Erlang
RabbitMQ использует Erlang для управления дальнейшими аспектами сетевого взаимодействия. Проверьте, правильно ли указаны параметры для Erlang:
RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS='-ssl_dist_opt server_certfile /path/to/your/cert.pem'
Убедитесь, что все параметры указаны верно.
4. Диагностика с помощью OpenSSL
Вы уже выполнили тесты с помощью OpenSSL, и это хороший шаг. Попробуйте включить более детализированное логирование, чтобы вы могли увидеть, какие именно шифры и протоколы используются. Для этого можно добавить флаги:
openssl s_client -connect localhost:<port> -tls1_2 -cipher ECDHE-RSA-AES256-GCM-SHA384 -msg -debug
5. Финальные рекомендации
Если ошибка продолжает возникать, обратите внимание на следующее:
- Убедитесь, что вся конфигурация (включая cookie) имеет единообразие на всех узлах кластера.
- Проверьте, что все узлы имеют одинаковые версии Erlang и RabbitMQ, чтобы устранить возможные несоответствия в поддерживаемых шифрах и протоколах.
Заключение
Ошибка "недостаточная безопасность" при использовании TLS в RabbitMQ, главным образом, указывает на несоответствие в настройках протоколов и шифров. Проведите полную проверку всех настроек, как на стороне сервера, так и клиента, чтобы добиться успешного соединения. Помните, что безопасность коммуникаций вашего кластера — это основа его эффективной работы.