【问题标题】:The client and server cannot communicate, because they do not possess a common algorithm, C# SslStream客户端和服务器无法通信,因为它们没有共同的算法,C# SslStream
【发布时间】:2016-11-09 05:32:28
【问题描述】:

以下是我在 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 协议不同,握手会失败?

【问题讨论】:

    标签: c# windows ssl tls1.2


    【解决方案1】:

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

    【讨论】:

    • 阅读 RFC5246 中关于 TLS 2.0 向后兼容性的部分,它指出 TLS 版本 1.0、1.1 和 1.2 与 SSL 3.0 非常相似,并且使用兼容的 ClientHello 消息;因此,支持所有这些相对容易。 RFC5246:link。我错过了什么吗?
    • 你没有错过任何东西。但是 SslStream 类将根据您指定的内容限制它使用的协议。因此,如果您在客户端上需要 Tls1.2 而服务器只接受 1.0,那么它将失败。在您的代码中,您明确地使服务器需要 1.0,而客户端需要 1.2。详情请见this MSDN page
    猜你喜欢
    • 1970-01-01
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多