我要疯了。。我花了几个小时试图在.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,都像在我的开发机器上一样工作?有人有过类似的经历吗?有人能给予我一个提示或指出正确的方向吗?先谢谢你,当我把头撞到墙上的时候。
1条答案
按热度按时间u5rb5r591#
最后,简单的解决方案是在使用用户/密码(PLAIN)身份验证时不将客户端/服务器证书传递给连接工厂。