客户端和服务器无法通信,因为它们不具备通用算法,C# SslStream

The client and server cannot communicate, because they do not possess a common algorithm, C# SslStream

以下是我在 Windows 10 上为 client/server 控制台应用程序进行相互 SSL 身份验证的设置:

  1. 有一个服务器侦听器控制台应用程序只接受 TLS 1.0 连接。
  2. 客户端控制台应用程序使用 SslStream.AuthenticateAsClient 配置安全连接并使用 TLS 1.2 连接。
  3. 我正在使用以下示例进行相互 SSL 身份验证: http://www.codeproject.com/Articles/326574/An-Introduction-to-Mutual-SSL-Authentication

服务器代码:

sslStream.AuthenticateAsServer(certificate, true, SslProtocols.Tls, true);

客户代码:

sslStream.AuthenticateAsClient(hostName, certificates, SslProtocols.Tls12, true);

错误:

异常:调用 SSPI 失败,请参阅内部异常。

内部异常:客户端和服务器无法通信,因为它们不具备通用算法

问题:

当我将客户端和服务器中的 SslProtocols 更改为相同时,即 TLS 1.0,SSL 握手成功。 为什么在客户端和服务器上的 SSL 协议不同时握手会失败?

协议必须相同。您必须 "negotiate" 服务器和客户端之间的通用协议,否则他们无法使用相同的语言。 SslProtocols 枚举标记为 [Flags] 以便您可以指定多个协议,例如SslProtocols.Tls | SslProtocols.Tls12