客户端和服务器无法通信,因为它们没有通用的算法C#SslStream
以下是我在Windows 10上为客户端/服务器控制台应用程序设置的相互SSL身份验证:客户端和服务器无法通信,因为它们没有通用的算法C#SslStream,c#,windows,ssl,tls1.2,C#,Windows,Ssl,Tls1.2,以下是我在Windows 10上为客户端/服务器控制台应用程序设置的相互SSL身份验证: 有一个仅接受TLS 1.0连接的服务器侦听器控制台应用程序 客户端控制台应用程序使用SslStream.authenticatesClient配置安全连接,并使用TLS 1.2连接 我使用以下示例进行相互SSL身份验证: 服务器代码: sslStream.AuthenticateAsServer(certificate, true, SslProtocols.Tls, true); sslStream.
sslStream.AuthenticateAsServer(certificate, true, SslProtocols.Tls, true);
sslStream.AuthenticateAsClient(hostName, certificates, SslProtocols.Tls12, true);
客户端代码:
sslStream.AuthenticateAsServer(certificate, true, SslProtocols.Tls, true);
sslStream.AuthenticateAsClient(hostName, certificates, SslProtocols.Tls12, true);
错误:
sslStream.AuthenticateAsServer(certificate, true, SslProtocols.Tls, true);
sslStream.AuthenticateAsClient(hostName, certificates, SslProtocols.Tls12, true);
异常:调用SSPI失败,请参阅内部异常
内部异常:客户端和服务器无法通信,因为它们没有通用的算法
问题:
sslStream.AuthenticateAsServer(certificate, true, SslProtocols.Tls, true);
sslStream.AuthenticateAsClient(hostName, certificates, SslProtocols.Tls12, true);
当我将客户端和服务器中的SslProtocols更改为相同时,即TLS 1.0,SSL握手成功。
当客户端和服务器上的SSL协议不同时,为什么握手会失败?协议必须相同。您必须在服务器和客户机之间“协商”一个公共协议,否则他们不能说相同的语言。
SslProtocols
enum标记为[Flags]
,以便您可以指定多个协议,例如SslProtocols.Tls | SslProtocols.Tls12
阅读关于Tls 2.0向后兼容性的RFC5246部分,其中说明Tls版本1.0、1.1.1和1.2以及SSL 3.0非常相似,并使用兼容的ClientHello消息;因此,支持所有这些都相对容易。RFC5246:。我遗漏了什么吗?你没有遗漏任何东西。但是,SslStream类将根据您指定的内容限制它使用的协议。因此,如果客户机上需要Tls1.2,而服务器只接受1.0,那么它将失败。在代码中,您显式地使服务器要求1.0,而客户端要求1.2。有关详细信息,请参阅。