Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
客户端和服务器无法通信,因为它们没有通用的算法C#SslStream_C#_Windows_Ssl_Tls1.2 - Fatal编程技术网

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

客户端和服务器无法通信,因为它们没有通用的算法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.

以下是我在Windows 10上为客户端/服务器控制台应用程序设置的相互SSL身份验证:

  • 有一个仅接受TLS 1.0连接的服务器侦听器控制台应用程序
  • 客户端控制台应用程序使用SslStream.authenticatesClient配置安全连接,并使用TLS 1.2连接
  • 我使用以下示例进行相互SSL身份验证:
  • 服务器代码:

    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。有关详细信息,请参阅。