Error: "TLS handshake error: tls: no cipher suite supported by both client and server" when NATS hosted on Windows Server 2012 R2

Error: "TLS handshake error: tls: no cipher suite supported by both client and server" when NATS hosted on Windows Server 2012 R2

我在 Windows Server 2012 R2 上使用 NATS 消息服务器。我提供的 TLS 配置如下:

authorization {
  user: administrator
  password: acVa4WHttwTQDpOnpGP1HuWi44WXTrYvrUO6uWkNlpLPeBFFOnpr6
  timeout:  500
}

tls {
  cert_file:  "C:/NATS/CertFile.pem"
  key_file:   "C:/NATS/KeyFile.pem"
  timeout:    2
}

我正在使用 BCrypt 来存储密码和 X509 自签名证书。当我 运行 Windows Server 2016 上的服务器时,客户端在使用安全通信时成功连接。但是当我在 Windows Server 2012 R2 上使用 NATS 服务器时,它在我的客户端应用程序中给了我一个例外。

你能帮帮我吗?

非常感谢,

阿黛尔。

我已经尝试更新到 NATS.Client 到 v0.9.0。

我在使用 NATS.Client API 时在 C# 中设置了以下 属性:

NATSConnectionSetting connectionSetting = NATSConnectionSetting.GetDefaultNATSConnectionSetting();
connectionSetting.UseTLS = true;

我在客户端应用程序日志中遇到的异常:

NATS.Client.NATSConnectionException: TLS Authentication error ---> System.AggregateException: One or more errors occurred. ---> System.Security.Authentication.AuthenticationException: A call to SSPI failed, see inner exception. ---> System.ComponentModel.Win32Exception: The message received was unexpected or badly formatted

在 NATS 服务器日志中我可以看到:

TLS handshake error: tls: no cipher suite supported by both client and server

一些 windows 系统可能会限制它们支持的密码套件。 NATS 默认仅使用最安全的密码套件,但允许在配置中指定其他密码套件。

这是一个 TLS 配置节,它指定了应该在大多数 windows 系统上工作的密码套件:

tls {
  cert_file:  "C:/NATS/CertFile.pem"
  key_file:   "C:/NATS/KeyFile.pem"

  cipher_suites: [
    "TLS_RSA_WITH_RC4_128_SHA",
    "TLS_RSA_WITH_3DES_EDE_CBC_SHA",
    "TLS_RSA_WITH_AES_128_CBC_SHA",
    "TLS_RSA_WITH_AES_256_CBC_SHA",
    "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA",
    "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA",
    "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA",
    "TLS_ECDHE_RSA_WITH_RC4_128_SHA",
    "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA",
    "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
    "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
    "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
    "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256"
  ]
}

另一个参考可以在测试配置中找到,here。我建议缩小密码套件的范围,只包括在您的环境中工作的最安全的套件,并尽可能避免使用 RSA。要获取所有可用密码套件的列表,运行 nats-server -help_tls。希望这对您有所帮助!