RabbitMQ — хранилище доверия пропускает все соединения через

#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 здесь это полезный инструмент.