#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
в настройках подключения