web-dev-qa-db-fra.com

Un appel à SSPI a échoué, voir exception interne - Impossible de contacter l'autorité de sécurité locale

J'ai une application WPF, qui utilise SSLStream pour se connecter au serveur et envoyer/recevoir des messages. Mon code repose largement sur cet exemple (SslTcpClient): https://msdn.Microsoft.com/en-us/library/system.net.security.sslstream(v=vs.110).aspx .

Cela a bien fonctionné pendant des mois. Toutefois, après avoir obtenu cette mise à jour Windows (Mise à jour cumulative pour Windows 10 version 1511 et Windows Server 2016 Technical Preview 4: 14 juin 2016 - https://support.Microsoft.com/en-us/kb/3163018 ) . Mon application a commencé à signaler cette exception:

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 puis-je faire ?

16
MilanMilanovich

Voici la solution, définie dans le registre:

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

comme noté ici

10
MilanMilanovich

Cela signifie que l'autre partie utilise une autre version de TLS et que vous utilisez une version plus ancienne.
Configurez l'attribut de sécurité sur TLS12 avant d'établir la connexion. C'est un problème largement connu, car de nombreux fournisseurs commencent à utiliser TLS12 (par exemple Paypal, Amazon, etc.).

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
11
Serg Sh

Si vous utilisez SslStream, vous devez définir explicitement la version de TLS dans l'appel AuthenticateAsClient, par exemple:

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