.net - RabbitMQ DotNet 客户端不连接到 SSL

标签 .net ssl mono rabbitmq haproxy

我们正在尝试制作一个 PoC,表明用不同语言编写的应用程序可以在一个组织中通过 RabbitMQ 代理进行通信。我们运行 vanilla RabbitMQ docker image rabbitmq:3.6.1-management 和执行 SSL 的 vanilla haproxy docker image haproxy:1.6.5:

frontend amqp_front
    bind *:5672 tcp-ut 5s
    mode tcp
    timeout client 60s
    timeout client-fin 1s
    no option clitcpka
    default_backend amqp_back

frontend amqp_front_ssl
    bind *:5671 tcp-ut 5s ssl crt /etc/certs/haproxy/rmq.pem ca-file /etc/certs/haproxy/root.crt verify required
    mode tcp
    timeout client 60s
    timeout client-fin 1s
    no option clitcpka
    acl client ssl_c_s_dn(CN) -m str cli
    tcp-request content reject if !client
    default_backend amqp_back

RabbitMQ 配置为:

[
  {rabbit,
    [
      { tcp_listeners, [ 5672 ] },
      { ssl_listeners, [ ] },
      {default_pass, <<"pwd">>},
      {default_user, <<"usr">>},
      {default_vhost, <<"default">>},
      {loopback_users, []}
    ]
  },
  { rabbitmq_management, [
      { listener, [
        { port, 15672 },
        { ssl, false }
        ]
      }
    ]
  }
].

我们在 GoNode.js 中编写了一段简单的代码,它们都加载 root.crt、cli.crt 和 cli.key 并成功连接到 SSL 端口5671 并消费。

尽管尝试使用 RabbitMQ.Client.dll(版本 3.6.0、3.6.1、3.6.2)在 .Net 中编写相同的简单代码,但失败了:

X509Store store = new X509Store (StoreName.Root, StoreLocation.LocalMachine);
store.Open (OpenFlags.ReadOnly);

var factory = new ConnectionFactory ();
factory.Ssl.Enabled = true;
factory.Ssl.ServerName = "rmq";
factory.Ssl.Certs = store.Certificates;
factory.Ssl.CertPassphrase = "";
factory.HostName = "localhost";
factory.Port = 5671;
factory.UserName = "usr";
factory.Password = "pwd";
factory.VirtualHost = "default";

var conn = factory.CreateConnection ()

发生的事情是 .Net 客户端忽略端口 5671 而忽略上面的设置,它只是转到 5672。如果 5672 打开 - 连接到它,如果 5672 关闭 - 失败并拒绝连接。

Go 和 Node.js 中的代码证明我的 SSL 设置是有效的。 .Net 客户端的错误显示 SSL 东西甚至没有机会跳入。

我在使用 debian jessie & Mono。

我是否遗漏了一些明显的东西?

最佳答案

这是 RabbitMQ .net 客户端 3.6.2 库在使用 SSL 时不遵守指定端口的问题。

它已被修复,将在 3.6.3 发布时可用(他们与服务器同步发布,所以不知道什么时候可以发布)。

您的选择是:-

  • 使用旧版本的 .net 客户端
  • 从最新源构建 .net 客户端
  • 尽可能使用标准端口
  • 等待3.6.3发布

关于.net - RabbitMQ DotNet 客户端不连接到 SSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37488107/

相关文章:

c# - MonoMac 上的 NSObject.InvokeOnMainThread?

c# - CS1061、CS0117 : `System.Linq.Enumerable' does not contain a definition for `Zip'

在 32 位和 64 位 Linux 中使用 long 的 C# pInvoke :

asp.net - 使用 Azure 上的现有数据库部署 ASP MVC 应用程序

ssl - 如何在 Meteor 中正确使用 SSL?

.net - 可以在 .NET 中编程的酷硬件/设备?

php - 如何将来自不同网站的php页面包含到当前网站?

java - SSL 证书升级导致问题

c# - 我可以嵌套 Parallel.Invoke 方法吗?

c# - Directory.CreateDirectory 因无效字符而失败