Docker容器内的RabbitMQ客户端无法通过SSL+PLAIN连接到另一个Docker容器内的RabbitMQ服务器

yyyllmsg  于 2023-06-29  发布在  Docker
关注(0)|答案(1)|浏览(228)

我要疯了。。我花了几个小时试图在.net 6 asp.net Web服务中使用HTTPS/AMQP/SSL配置我的RabbitMQ客户端。
我在服务器端和客户端都做了几次尝试。当我从Visual Studio在本地Windows机器上运行服务/客户端并连接到上面提到的RabbitMQ服务器时,SSL连接工作正常。
一旦我将我的服务作为Docker中包含的Web服务部署在Linux主机上,就无法建立连接。它只是从底层的SSL流中出现了一个错误,这并没有告诉我出了什么问题。
“System.IO.IOException:从传输流接收到意外的EOF或0字节。at System.Net.Security.SslStream.ReceiveBlobAsync[TIOAdapter](TIOAdapter adapter)”或“RabbitMQ.Client.Exceptions.BrokerUnreachableException:指定的终结点均不可访问System.IO.IOException:从传输流收到意外的EOF或0字节。”
因此,我在服务器端尝试了不同的SSL配置,检查了TLS设置等。使用Wireshark检查显示,客户端Docker端口和RabbitMQ服务器端口之间根本没有网络流量。所以我在webservicedocker容器中安装了telnet,并连接到我的RabbitMQ服务器的端口5671。已建立连接...外部主机已关闭连接...但仍然看不到网络流量?!可能是因为默认的桥接docker网络配置,我看不到任何流量?
下面是我的服务器配置文件/etc/rabbitmq/conf.d/10-defaults.conf

loopback_users.guest = false

log.console = true
log.file = true
log.file = /tmp/rabbit.log
log.file.level = debug

management.ssl.port       = 15671
management.ssl.cacertfile = /https/ca.pem
management.ssl.certfile   = /https/wildcard.pem
management.ssl.keyfile    = /https/wildcard.key

listeners.ssl.default = 5671
auth_mechanisms.1 = PLAIN

ssl_options.cacertfile = /https/ca.pem
ssl_options.certfile   = /https/wildcard.pem
ssl_options.keyfile    = /https/wildcard.key

这是我的客户端C#配置

var certPath = Environment.GetEnvironmentVariable("ASPNETCORE_Kestrel__Certificates__Default__Path");
var certPassphrase = Environment.GetEnvironmentVariable("ASPNETCORE_Kestrel__Certificates__Default__Password");
var connectionFactory = new BasicConnectionFactory("hostname_docker_server", "myusr", "mypwd", new SecuredConnectionSettings("hostname_docker_server", certPath, certPassphrase))
                    .GetSecuredConnectionFactory();

“connectionFactory”是用于建立连接的RabbitMQ.Client.ConnectionFactory。(版本6.4.0)
webservice docker run命令看起来像这样:

docker run --user root --restart always -p 5441:443 -e ASPNETCORE_HTTPS_PORT=5441 -e ASPNETCORE_URLS="https://+" -e ASPNETCORE_Kestrel__Certificates__Default__Password=${env.WILDCARD_SECRET} -e ASPNETCORE_Kestrel__Certificates__Default__Path=/https/wildcard.pfx -v /etc/ssl:/https -d nexus.api:18444/api.prod:latest

RabbitMQ服务器的docker run命令看起来像这样:

docker run --hostname localhost --name rabbitmq -p 5671:5671 -p 15671:15671 -e RABBITMQ_NODENAME='rabbit@localhost' --volume /etc/ssl:/https -d rabbitmq:latest

此外,RabbitMQ启动并运行后,我在docker bash中执行以下操作:

rabbitmq-plugins enable rabbitmq_management
rabbitmq-plugins enable rabbitmq_auth_mechanism_ssl

这两个服务都运行在同一个SUSE Linux主机上。
所以我现在的问题是...我的RabbitMQ客户端发生了什么,以至于它甚至无法连接到服务器/网络,而其他一切,如swaggerUI,都像在我的开发机器上一样工作?有人有过类似的经历吗?有人能给予我一个提示或指出正确的方向吗?先谢谢你,当我把头撞到墙上的时候。

u5rb5r59

u5rb5r591#

最后,简单的解决方案是在使用用户/密码(PLAIN)身份验证时不将客户端/服务器证书传递给连接工厂。

var connectionFactory = new ConnectionFactory()
{
    HostName = "hostname_docker_server",
    Ssl = new SslOption()
    {
        Enabled = true,
        ServerName = "hostname_docker_server",
    },
    UserName = "myusr",
    Password = "mypwd"
};

相关问题