【发布时间】:2016-05-27 16:13:39
【问题描述】:
我们正在尝试制作一个 PoC,表明用不同语言编写的应用程序可以通过一个组织中的 RabbitMQ 代理进行通信。我们运行执行 SSL 的 vanilla RabbitMQ docker image rabbitmq:3.6.1-management 和 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 }
]
}
]
}
].
我们在 Go 和 Node.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.config怎么样? -
我已经用 RabbitMQ 配置更新了原始帖子。这是一个默认配置。
标签: .net ssl mono rabbitmq haproxy