У меня проблема с подключением к моему брокеру rabbitmq на сервере Ubuntu 18.04 через tls. Я использую следующий код на стороне клиента.
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Net.Security;
using System.Security.Authentication;
using System.Text;
namespace firstConsumer
{
class Program
{
static void Main(string[] args)
{
var factory = new ConnectionFactory()
{
HostName = "my-domain.de",
UserName = "main",
Password = "1234",
Port = 5671,
Ssl = new SslOption
{
Enabled = true,
Version = SslProtocols.Tls12,
ServerName = "my-domain.de",
AcceptablePolicyErrors = SslPolicyErrors.RemoteCertificateNameMismatch |
SslPolicyErrors.RemoteCertificateChainErrors |
SslPolicyErrors.RemoteCertificateNotAvailable,
}
};
using (var connection = factory.CreateConnection())
{
using (var channel = connection.CreateModel())
{
channel.QueueDeclare(queue: "test-queue",
durable: false,
exclusive: false,
autoDelete: true,
arguments: null);
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var body = ea.Body.ToArray();
var message = Encoding.UTF8.GetString(body);
Console.WriteLine(" [x] Received {0}", message);
};
channel.BasicConsume(queue: "test-queue",
autoAck: true,
consumer: consumer);
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
}
}
}
}
}
Это один из примеров кодов из документации rabbitmq для подключения к брокеру с c# через tls.
RabbitMQ работает в контейнере docker с действующими сертификатами от Certbot (Let's Encrypt). Он также прослушивает правые порты tls:
rabbitmq_1 | 2020-08-01 16:40:42.082 [info] <0.523.0> started TCP listener on [::]:5672
rabbitmq_1 | 2020-08-01 16:40:42.147 [info] <0.540.0> started TLS (SSL) listener on [::]:5671
Это мой файл docker -compose:
version: '3'
services:
rabbitmq:
image: 'rabbitmq:3'
hostname: 'rabbitmq'
ports:
- '4369:4369'
- '5672:5672'
- '5671:5671'
- '25672:25672'
volumes:
- ./config/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf
- ./Cert/Cert-tls-gen/:/cert/
И вот мои настройки порта на ufw
Zu Aktion Von
-- ------ ---
OpenSSH ALLOW Anywhere
5672 ALLOW Anywhere
Nginx Full ALLOW Anywhere
5671 ALLOW Anywhere
20,21,10000:10100/tcp ALLOW Anywhere
21 DENY Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
5672 (v6) ALLOW Anywhere (v6)
Nginx Full (v6) ALLOW Anywhere (v6)
5671 (v6) ALLOW Anywhere (v6)
20,21,10000:10100/tcp (v6) ALLOW Anywhere (v6)
21 (v6) DENY Anywhere (v6)
Я всегда получаю следующее сообщение об ошибке, когда пытаюсь запустить код C#.
IOException: Authentication failed because the remote party has closed the transport stream.
И в журнале rabbitmq нет журналов попытки подключения через tls . Просто ничего не происходит. RabbitMQ просто не замечает никаких попыток подключения через tls.
Приведенный выше код отлично работает, когда я удаляю настройки ssl и пытаюсь подключиться через TCP на порт 5672. Без tls я также получаю журналы соединения с моим клиентом, и все работает нормально.
Мне кажется, что сервер отказывает в соединении, но я не знаю почему.
Это сервер fre sh только с nginx и этим docker контейнером.
Я также пробовал пример Java с тем же результатом для tls. Но он работает без настроек tls.
Exception in thread "main" javax.net.ssl.SSLException: Connection reset
Я был бы признателен, если бы кто-нибудь мог помочь мне с этой проблемой. Уже 3 дня пытаюсь решить.
Спасибо