使用TLS 1.2安全连接到RabbitMQ

使用TLS 1.2安全连接到RabbitMQ,rabbitmq,windows-server-2008-r2,tls1.2,.net-4.7.2,Rabbitmq,Windows Server 2008 R2,Tls1.2,.net 4.7.2,我正在尝试使用TLS1.2连接到RabbitMQ服务器,但似乎无法做到这一点。我已经验证了我的用户名和密码可以正常工作,因为我可以连接到RabbitMQ web客户端 using System; using System.Net; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using Syste

我正在尝试使用TLS1.2连接到RabbitMQ服务器,但似乎无法做到这一点。我已经验证了我的用户名和密码可以正常工作,因为我可以连接到RabbitMQ web客户端

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\u DF\u SIT\u Server\u certificate\ca\u certificate.pem”。我正在使用NuGet 5.1.0中的RabbitMQ客户端

我怀疑我是否需要证书验证回调方法,因为据我所知,它是单向连接。此应用程序将只使用&根本不发布。我错过了什么?证书位于客户端服务器上,但本身未安装

它抛出一个错误:


RabbitMQ.Client.Exceptions.BrokerRunReachableException:指定的终结点均不可访问---->System.AggregateException:发生一个或多个错误。-->System.Security.Authentication.AuthenticationException:调用SSPI失败,请参阅内部异常。-->System.ComponentModel.Win32Exception:客户端和服务器无法通信,因为它们没有通用算法

为了将TLS与RabbitMQ一起使用,必须通过位于Windows中的RabbitMQ配置启用此功能,该配置位于
%APPDATA%/RabbitMQ/RabbitMQ.conf
文件中

根据所使用的Erlang版本,配置可以是经典格式/ini样式。有关详细信息,请参阅

对于较新的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>
listeners.ssl.default=5671
ssl\u options.verify=验证\u无
ssl\u options.fail\u如果\u no\u peer\u cert=false
ssl_options.cacertfile=
ssl_options.certfile=
ssl_options.keyfile=
以上所有内容都可以通过我为此编写的脚本进行自动化和验证

上面的脚本确实如此

  • 检查是否安装了OpenSSL,如有必要,请下载以生成自签名证书
  • 修改rabbitmq配置以启用TLS
  • 在RabbitMQ上启用TLS后,使用OpenSSL测试TLS

您使用的是什么版本的Erlang?您可能需要启用其他密码套件。注意:RabbitMQ团队监控
RabbitMQ用户
,有时只回答有关StackOverflow的问题。我认为我们需要做的是购买一台新的Windows 2016服务器。更新:部署到Windows 2016服务器后,我没有遇到任何问题。以前的尝试使用的是Windows 08R2。其他人甚至在Windows 2012上也报告了相同的问题。这是一个有趣的信息,感谢您的跟进。请注意,我当时试图连接的RabbitMQ服务器位于某种Linux设备上。我的猜测是,因为我的应用程序试图从旧windows中提取消息的服务器旧windows->Linux可能导致无法协商通用密码的问题。很高兴知道。我只参与了tls1.2在消费者方面的工作。