.NET Core对接AmazonMQ-RabbitMQ遇amqps协议异常求兼容方案
针对你遇到的MassTransit.RabbitMqTransport.RabbitMqAddressException: 'The invalid scheme was specified: amqps'异常,结合你不想升级到最新MassTransit版本的需求,这里有几个可行的解决办法:
1. 替换amqps为amqp并手动启用SSL配置
MassTransit 5.x的RabbitMQ传输对amqps scheme的支持不完善,你可以改用amqp作为URI协议,然后通过UseSsl手动开启SSL加密,达到和amqps相同的安全效果。同时注意AmazonMQ要求使用TLS 1.2,需要明确指定:
cfg.Host(new Uri("amqp://b-mdefg-ff37-4e33-855c-577a0c749659.mq.us-westeast-2.amazonaws.com:5671/"), h => { h.Username("MyUsername"); h.Password("XXXXXXXXX"); h.UseSsl(s => { s.Protocol = SslProtocols.Tls12; // 指定服务器名称,避免证书验证时的主机名不匹配问题 s.ServerName = "b-mdefg-ff37-4e33-855c-577a0c749659.mq.us-westeast-2.amazonaws.com"; }); });
注意:你当前代码里用的端口是5432,这通常是PostgreSQL的默认端口,而AmazonMQ-RabbitMQ的AMQP SSL默认端口是5671,请确认你的实例端口配置是否正确,端口错误也会导致连接失败。
2. 统一MassTransit相关NuGet包版本
你当前使用的NuGet包版本不一致:MassTransit.AspNetCore v5.5.6,但其他包是v5.3.2/v5.1.5,版本差异可能导致内部API不兼容,引发各种异常。建议将所有MassTransit相关包升级到同一版本(比如5.5.6),这不会像升级到最新版本那样引发大量代码变更,但能解决版本不一致带来的兼容性问题,同时5.5.6版本对RabbitMQ的支持比5.3.x更稳定。
3. 验证证书信任(可选)
如果仍然遇到SSL证书验证问题,可以在UseSsl中添加证书信任逻辑(不建议在生产环境禁用验证,除非是测试场景):
h.UseSsl(s => { s.Protocol = SslProtocols.Tls12; s.ServerName = "your-amazonmq-hostname"; // 仅测试环境使用:禁用证书验证 // s.ClientCertificates.Add(new X509Certificate2("path-to-certificate.pfx")); // s.RemoteCertificateValidationCallback = (sender, cert, chain, errors) => true; });
这些方法不需要升级到最新MassTransit版本,同时能解决你当前的amqps scheme异常问题。
内容的提问来源于stack exchange,提问作者Ben Power

