我们正在尝试制作一个 PoC,以展示在同一组织中,使用不同语言编写的应用程序可以通过 RabbitMQ broker 进行通信。我们运行原始的 RabbitMQ docker 镜像rabbitmq:3.6.1-management和原始的 haproxy docker 镜像haproxy:1.6.5,haproxy镜像支持 SSL。
我们已经用Go和Node.js编写了一段简单的代码,它们都加载了root.crt、cli.crt和cli.key,并成功连接到SSL端口5671并进行消费。
但是,尝试使用RabbitMQ.Client.dll(版本为3.6.0、3.6.1、3.6.2)在.Net中编写相同的简单代码失败了。
.Net客户端会忽略5671端口的设置,只会连接5672端口。如果5672端口开放,则连接成功;如果5672端口关闭,则连接失败并显示"connection refused"错误。Go和Node.js代码证明我的SSL设置是正确的。.Net客户端的错误表明SSL设置没有生效的机会。我使用debian jessie和Mono,请问我是否漏掉了什么显而易见的问题?
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端口关闭,则连接失败并显示"connection refused"错误。Go和Node.js代码证明我的SSL设置是正确的。.Net客户端的错误表明SSL设置没有生效的机会。我使用debian jessie和Mono,请问我是否漏掉了什么显而易见的问题?
rabbitmq.config
长什么样子? - cantSleepNow