C#连接AWS上的RabbitMQ报错None of the specified endpoints were reachable
问题根因
你使用的5671是AWS RabbitMQ的AMQPS加密端口,当前代码仅配置了基础连接参数,没有启用TLS验证,导致TCP连接建立后TLS握手失败,最终抛出None of the specified endpoints were reachable异常。Telnet、nc能连通仅代表TCP层网络可达,不代表应用层TLS握手、AMQP协议交互正常。
修复方案
调整ConnectionFactory的SSL配置项,开启TLS并匹配AWS证书的校验规则,正确连接代码如下:
[Fact] public void RabbitConnection() { var cf = new ConnectionFactory() { HostName = "longguid.amazonaws.com", Password = "pass", UserName = "user", Port = 5671, // 新增以下SSL配置 Ssl = new SslOption() { Enabled = true, // 服务器名称必须和HostName一致,匹配AWS颁发的证书域名 ServerName = "longguid.amazonaws.com", // 测试环境如果有证书校验问题可临时打开,生产环境必须移除 // AcceptablePolicyErrors = System.Net.Security.SslPolicyErrors.RemoteCertificateNameMismatch | System.Net.Security.SslPolicyErrors.RemoteCertificateChainErrors } }; // Act var con = cf.CreateConnection(); // Assert Assert.True(true); }
额外注意事项
- 不要使用
tls.none配置,该配置对应未加密的AMQP协议,仅适用于5672端口,AWS托管RabbitMQ默认不会对外暴露5672端口 - 如果使用Uri方式配置,需要使用
amqps://前缀的完整地址,同时仍需配置上述Ssl选项 - 确认你的AWS安全组已经放开了本地出口IP到RabbitMQ实例5671端口的入站规则
内容的提问来源于stack exchange,提问作者Mohamed
相关产品推荐
相关产品推荐

