Подключение Pika с использованием SSL без файла сертификата

#python #rabbitmq #pika

#python #rabbitmq #pika

Вопрос:

Я пытаюсь использовать pika для подключения к RabbitMQ с использованием SSL (самоподписанный).

Проблема в том, что соединение не завершается сбоем, если я не передам файл сертификата pika.

Это мой код:

 import pika
import urllib

connection = pika.BlockingConnection(pika.URLParameters("amqps://guest:guest@172.16.120.130:25585"))
channel = connection.channel()

channel.queue_declare(queue='hello')
channel.basic_publish(exchange='',
                      routing_key='hello',
                      body='Hello World!')

print(" [x] Sent 'Hello World!'")
connection.close()
  

И это мой rabbitmq.config:

 {tcp_listeners, []},
{ssl_listeners, [25585]},
{ssl_options, [{cacertfile,           "/etc/rabbitmq/certs/cacert.pem"},
               {certfile,             "/etc/rabbitmq/certs/cert.pem"},
               {keyfile,              "/etc/rabbitmq/certs/key.pem"},
               {verify,               verify_peer},
               {versions, ['tlsv1.2', 'tlsv1.1', 'tlsv1']},
               {fail_if_no_peer_cert, false}]},
  

Я отключил TCP-соединение и включил SSL, почему соединение не прерывается?

Ответ №1:

Это из-за такой конфигурации на сервере: {fail_if_no_peer_cert, false}

Измените его на : {fail_if_no_peer_cert, true}

Это означает прерывание соединения, если клиент не предоставил сертификат.

Комментарии:

1. Я не хочу аутентификации клиента, я знаю, что клиентская библиотека (pika) разорвет соединение, если сертификат недействителен

2. В этом случае создайте соединение со следующими параметрами на стороне клиента: pika.BlockingConnection(pika.ConnectionParameters( host='172.16.120.130', port=25585, credentials=pika.PlainCredentials(user, password), ssl=True, ssl_options = {"cert_reqs": ssl.CERT_REQUIRED, "ca_certs": caCert})) Где caCert — файл сертификата, содержащий сертификат сервера.

3. Если вы этого не сделаете, ваш клиент проигнорирует проверку сертификата сервера. вам нужно указать вашему клиенту, чтобы он подтвердил сертификат сервера с помощью ssl_options в настройках подключения