首页 > 解决方案 > rabbitmq,Java 客户端通过 SSL 工作,但 .NET 不支持

问题描述

我是 rabbitmq 的新手,但我必须连接到远程代理才能发送和接收消息。远程服务器超出了我的控制范围,几乎不可能从它的团队那里得到答案。不过,我可以使用地址、端口、虚拟主机和用户凭据。服务器使用 TLS v1.2。问题是我无法使用 .NET 客户端建立与服务器的连接。客户端是“rabbitmq.client.5.1.0”,.NET Framework 4.5.1 和 VS 2017。我的代码是:

public bool Start() {
  try {
    var f = new ConnectionFactory();
    f.UserName = "TestUser";
    f.Password = "TestPwd";
    f.HostName = "x.x.x.x";
    f.Port = 5673;
    f.VirtualHost = "TestVH";

    f.Ssl.Version = SslProtocols.Tls12;
    f.Ssl.Enabled = true;
    f.Ssl.AcceptablePolicyErrors = SslPolicyErrors.RemoteCertificateChainErrors
        | SslPolicyErrors.RemoteCertificateNameMismatch
        | SslPolicyErrors.RemoteCertificateNotAvailable;
    var c = f.CreateConnection();
  } catch( Exception e ) {
    throw e;
  }
}

它抛出一个异常,最里面的是:

身份验证失败,因为远程方已关闭传输流。

Wireshark 捕获)。

如果我使用 Java ( 1.8, amqp-client-4.0.2) 进行操作,我可以成功连接到服务器。

public static void main( String[] args ) throws Exception{
  ConnectionFactory factory = new ConnectionFactory();
  factory.setHost("x.x.x.x");
  factory.setPort(5673);
  factory.setUsername( "TestUser" );
  factory.setPassword( "TestPwd" );
  factory.setVirtualHost( "TestVH" );

  factory.useSslProtocol("TLSv1.2");
  Connection conn = factory.newConnection();
}

Wireshark 捕获

我想使用 C# 来完成工作,但我无法解决这个问题。任何帮助将不胜感激!

标签: javac#.netsslrabbitmq

解决方案


尝试更改此行:

f.Ssl.Version = SslProtocols.Tls12;

对此:

f.Ssl.Version = SslProtocols.Tls12 | SslProtocols.Ssl3 | SslProtocols.Tls11 | SslProtocols.Ssl2;

如果那行得通,那么您可以缩小范围


推荐阅读