客户端和服务器无法通信,因为它们没有共同的算法,C# SslStream。

3
以下是我在Windows 10上为客户端/服务器控制台应用程序设置双向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 协议不同时,握手会失败?

1个回答

3

协议必须相同。您必须在服务器和客户端之间“协商”一个共同的协议,否则它们无法说同一种语言。SslProtocols 枚举标记为 [Flags] ,因此您可以指定多个协议,例如:SslProtocols.Tls | SslProtocols.Tls12


阅读RFC5246关于TLS 2.0向后兼容性的章节,它指出TLS版本1.0、1.1和1.2以及SSL 3.0非常相似,并使用兼容的ClientHello消息;因此,支持它们所有都相对容易。RFC5246:链接。我有什么遗漏吗? - Aditya Sirohi
1
你没有错过任何东西。但是,SslStream类将根据您指定的内容限制其使用的协议。因此,如果您要求客户端使用Tls1.2,而服务器只接受1.0,则将失败。在您的代码中,您明确要求服务器需要1.0,而客户端需要1.2。有关详细信息,请参见此MSDN页面。 - leetibbett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接