Я пытаюсь подключиться к серверу RabbitMQ с помощью TLS1.2, но не могу этого сделать. Я убедился, что мое имя пользователя и пароль работают, так как я могу подключиться к веб-клиенту RabbitMQ.
using System;
using System.Net;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Configuration;
using System.Xml;
using System.Xml.Linq;
using System.Xml.XPath;
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
namespace DigitalFulfillmentRabbitMQ
{
public class RabbitMQService
{
public IConnection GetRabbitMqConnection()
{
ConnectionFactory connectionFactory = new ConnectionFactory();
// ServicePointManager.CertificatePolicy = new TrustAllCertificatePolicy();
// connectionFactory.Ssl.CertificateValidationCallback = CheckValidationResult();
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
connectionFactory.HostName = ConfigurationManager.AppSettings["RabbitMQServer"].ToString();
connectionFactory.VirtualHost = ConfigurationManager.AppSettings["RabbitMQVHOST"].ToString();
connectionFactory.Port = Int32.Parse(ConfigurationManager.AppSettings["RabbitMQPort"].ToString());
connectionFactory.UserName = ConfigurationManager.AppSettings["RabbitMQAccountUserName"].ToString();
connectionFactory.Password = ConfigurationManager.AppSettings["RabbitMQAccountPassword"].ToString();
// connectionFactory.Ssl.ServerName = System.Net.Dns.GetHostName();
connectionFactory.Ssl.ServerName = ConfigurationManager.AppSettings["RabbitMQServer"].ToString();
connectionFactory.Ssl.CertPath = ConfigurationManager.AppSettings["RabbitMQSSLCertPath"].ToString();
// connectionFactory.Ssl.CertPassphrase = ConfigurationManager.AppSettings["RabbitMQSSLCertPassphrase"].ToString();
connectionFactory.Ssl.Enabled = Convert.ToBoolean(ConfigurationManager.AppSettings["RabbitMQSSLIsEnabled"].ToString());
connectionFactory.Ssl.Version = System.Security.Authentication.SslProtocols.Tls12;
return connectionFactory.CreateConnection();
}
}
}
Сертификат представляет собой сертификат .pem, который я установил на клиенте. Я использую порт 8071. Путь к сертификату имеет формат «D:\RabbitMQ_DF_SIT_Server_certificate\ca_certificate.pem». Я использую клиент RabbitMQ из NuGet 5.1.0.
Я сомневаюсь, что мне нужен метод обратного вызова проверки сертификата, потому что, насколько я понимаю, это одностороннее соединение. Это приложение будет только потреблять и не публиковать вообще. Что мне не хватает? Сертификат находится на клиентском сервере, но сам по себе не установлен.
Выдает ошибку:
RabbitMQ.Client.Exceptions.BrokerUnreachableException: ни одна из указанных конечных точек не была доступна ---> System.AggregateException: произошла одна или несколько ошибок. ---> System.Security.Authentication.AuthenticationException: не удалось выполнить вызов SSPI, см. внутреннее исключение. ---> System.ComponentModel.Win32Exception: Клиент и сервер не могут обмениваться данными, поскольку у них нет общего алгоритма
Я думаю, что нам нужно будет приобрести новый сервер Windows 2016.
ОБНОВЛЕНИЕ: После развертывания на сервере Windows 2016 у меня не было проблем. Предыдущие попытки были с Windows 08R2. Другие сообщали о той же проблеме даже с Windows 2012.
Это интересная информация, спасибо за продолжение.
Обратите внимание, что сервер RabbitMQ, к которому я пытался подключиться в то время, находился на какой-то Linux-системе. Я предполагаю, что поскольку сервер, с которого мое приложение пыталось получить сообщения, был старыми окнами, старые окна -> Linux, вероятно, способствовали проблеме невозможности согласования общего шифра.





Чтобы использовать TLS с RabbitMQ, необходимо включить это через конфигурацию RabbitMQ, расположенную в Windows в файле %APPDATA%/RabbitMQ/rabbitmq.conf.
В зависимости от используемой версии Erlang, конфиг может иметь классический формат / стиль ini. Дополнительные сведения см. в статье https://www.rabbitmq.com/configure.html.
С более новым форматом конфигурации в стиле ini конфигурация должна выглядеть так:
listeners.ssl.default = 5671
ssl_options.verify = verify_none
ssl_options.fail_if_no_peer_cert = false
ssl_options.cacertfile = <location to cacertfile.crt>
ssl_options.certfile = <location to certfile.crt>
ssl_options.keyfile = <location to private.key>
Все вышеперечисленное можно автоматизировать и проверить с помощью скрипта, который я написал для этого https://gist.github.com/skewl84/a72321379a65c4c5cfd447f8806b5188
Сценарий выше делает
хорошо знать. Я участвовал только в том, чтобы заставить tls1.2 работать на стороне потребителя.
Какую версию Эрланга вы используете? Возможно, вам придется включить дополнительные наборы шифров документы. ПРИМЕЧАНИЕ: команда RabbitMQ отслеживает
rabbitmq-usersсписок рассылки и лишь иногда отвечает на вопросы в StackOverflow.