#java #rabbitmq #whitelist #truststore
#java #rabbitmq #белый список #хранилище доверия
Вопрос:
У меня проблема с хранилищем доверия RabbitMQ. Я установил плагин, как показано на github, плагин действительно загружается, он даже отвечает, когда я добавляю сертификаты в папку белого списка (если я добавляю плохой закрытый ключ, подобный cert.pem, я получаю ответ об ошибке, что сертификат не является сертификатом, если я добавляю хороший, я получаю такой ответ: хранилище доверия: загрузка сертификата ‘cert.pem’) — и это здорово. Но именно здесь начинаются проблемы. соединения MQTT и AMQP, которые я создаю с моим Java-клиентом, передаются через, даже если в папке с белым списком нет сертификатов. Если я правильно понимаю идею всего плагина, они должны передаваться только в том случае, если в папке с белым списком присутствуют сертификаты, в противном случае их не должно быть.
Кто-нибудь сталкивался с тем же самым?
Технология: RabbitMQ в docker, Java-клиент, использующий библиотеку bouncycastle для ssl
// РЕДАКТИРОВАТЬ дополнение: файл Rabbitmq.config
[
{ rabbit, [
{ loopback_users, [ ] },
{ssl_handshake_timeout, 100000},
{ tcp_listeners, [ 5672 ] },
{ ssl_listeners, [ 5671 ] },
{ ssl_options, [
{ cacertfile, "/etc/tls/cacert.pem" },
{ certfile, "/etc/tls/cert.pem" },
{ keyfile, "/etc/tls/key.pem" },
{ verify, verify_peer },
{ fail_if_no_peer_cert, true },
{ reuse_sessions, false}
] },
{ default_pass, <<"guest">> },
{ default_user, <<"guest">> },
{ default_vhost, <<"/">> },
{ hipe_compile, false }
] },
{ rabbitmq_management, [ { listener, [
{ port, 15671 },
{ ssl, true },
{ ssl_opts, [
{ cacertfile, "/etc/tls/cacert.pem" },
{ certfile, "/etc/tls/cert.pem" },
{ fail_if_no_peer_cert, false },
{ keyfile, "/etc/tls/key.pem" },
{ verify, verify_peer }
] }
] } ] },
{ rabbitmq_mqtt, [
{ vhost, <<"/">> },
{ exchange, <<"amq.topic">> },
{ default_user, <<"guest">> },
{ default_pass, <<"guest">> },
{ tcp_listeners, [ 1883 ] },
{ ssl_listeners, [ 8883 ] }
] },
{rabbitmq_trust_store, [
{directory, "/etc/whitelist"},
{refresh_interval, {seconds, 30}},
{log_levels, [{connection, debug}, {channel, debug}, {federation, debug}]}
]}
].
Ответ №1:
Я в значительной степени предполагаю, основываясь на ограниченном объеме предоставленной информации, но у вас, вероятно, не настроен TLS для проверки сертификата клиента. Вам нужно использовать verify_peer
параметр конфигурации RabbitMQ. У нас есть исчерпывающие документы, которые я предлагаю вам прочитать — https://www.rabbitmq.com/ssl.html, https://www.rabbitmq.com/troubleshooting-ssl.html
Также, пожалуйста, обратите внимание, что сертификаты, которые вы вносите в белый список, являются сертификатами CA, используемыми для подписи клиентских сертификатов, предоставляемых вашими приложениями, а не самими клиентскими сертификатами.
Наконец, лучший способ быстро получить помощь — предоставить набор файлов, которые кто-то может использовать для запуска RabbitMQ, и тестовое приложение, чтобы увидеть проблему.
ПРИМЕЧАНИЕ: команда RabbitMQ отслеживает rabbitmq-users
список рассылки и только иногда отвечает на вопросы в StackOverflow.
Комментарии:
1. Извините за поздний ответ, я добавил файл конфигурации в сообщение. Он по-прежнему пропускает все. Я забыл упомянуть, что сертификаты являются самозаверяющими.
2. Вы уверены, что ваш код подключается к порту 5671? Вы пробовали это без использования хранилища доверия?
3. 5671 предназначен для SSL AMQP, верно? Я должен использовать протокол SSL MQTT, поэтому я использую порт 8883. Я пробовал подключаться с плагином хранилища доверия и без него, результаты те же — я могу подключиться без каких-либо проблем (даже если папка белого списка хранилища доверия пуста)
4. Вы пробовали использовать порт TLS AMQP с клиентом AMQP? Я перепроверю, как настроить TLS для MQTT, поскольку я удивлен, что в нем также нет
ssl_options
раздела.5. Вы должны использовать эти инструкции , чтобы убедиться, что TLS настроен правильно для всех портов с поддержкой TLS.
openssl
здесь это полезный инструмент.