socket net example async asp c# .net networking network-programming sspi

c# - net - Falló una llamada a SSPI, ver excepción interna-No se puede contactar a la Autoridad de Seguridad Local



socket connect c# (3)

Tengo una aplicación WPF, que utiliza SSLStream para conectarse al servidor y enviar / recibir algunos mensajes. Mi código se basa más ampliamente en este ejemplo (SslTcpClient): https://msdn.microsoft.com/en-us/library/system.net.security.sslstream(v=vs.110).aspx .

Esto funcionó bien durante meses. Sin embargo, después de obtener esta actualización de Windows (Actualización acumulativa para Windows 10 versión 1511 y Windows Server 2016 Technical Preview 4: 14 de junio de 2016 - https://support.microsoft.com/en-us/kb/3163018 ). Mi aplicación comenzó a reportar esta excepción:

System.Security.Authentication.AuthenticationException: A call to SSPI failed, see inner exception. ---> System.ComponentModel.Win32Exception: The Local Security Authority cannot be contacted --- End of inner exception stack trace --- at System.Net.Security.SslState.StartSendAuthResetSignal(ProtocolToken message, AsyncProtocolRequest asyncRequest, Exception exception) at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest) at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest) at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest) at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest) at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest) at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest) at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest) at System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest) at System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult) at System.Net.Security.SslStream.AuthenticateAsClient(String targetHost, X509CertificateCollection clientCertificates, SslProtocols enabledSslProtocols, Boolean checkCertificateRevocation) at MyAPP.Core.Services.Network.Impl.SslTcpClient.ClientSideHandshake() at MyAPP.Core.Services.Network.Impl.SslTcpClient.Connect() at MyAPP.Core.Services.Impl.MessageService.SendMessage(String message)

Que puedo hacer ?


Aquí está la solución, establecida en el registro:

[HKEY_LOCAL_MACHINE / SYSTEM / CurrentControlSet / Control / SecurityProviders / SCHANNEL / KeyExchangeAlgorithms / Diffie-Hellman] "ClientMinKeyBitLength" = dword: 00000200

como se señala here


Esto significa que la otra parte está usando otra versión de TLS y usted está usando una versión anterior.
Configure el atributo de seguridad a TLS12 antes de realizar la conexión. Este es un problema ampliamente conocido, ya que muchos proveedores comienzan a usar TLS12 (por ejemplo, paypal, amazon, etc.).

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;


Si está utilizando SslStream, entonces necesita establecer explícitamente la versión TLS en la llamada AuthenticateAsClient, por ejemplo:

ssl.AuthenticateAsClient(url, null, SslProtocols.Tls12, false);