Un appel à SSPI a échoué, voir exception interne - L'Autorité de sécurité locale ne peut pas être contacté

j'ai une application WPF, qui utilise SSLStream pour se connecter au serveur et envoyer/recevoir des messages. Mon code est largement basé 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. Cependant, après avoir obtenu cette mise à jour de windows (mise à jour Cumulative pour Windows 10 version 1511 et Windows Server 2016 Technical Preview 4: juin 14, 2016 - https://support.microsoft.com/en-us/kb/3163018). Mon application a commencé à faire rapport de 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 ?

15
demandé sur MilanMilanovich 2016-06-20 17:48:55

3 réponses

Voici la solution, définie dans le registre:

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

comme l'a noté ici

9
répondu MilanMilanovich 2017-05-23 12:26:03

cela signifie que l'autre côté utilise une autre version de TLS et que vous utilisez une version plus ancienne.

Définissez l'attribut de sécurité à TLS12 avant de faire la connexion. C'est un problème largement connu, car de nombreux fournisseurs commencent à utiliser TLS12 (par exemple paypal,amazon et ainsi de suite).

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
7
répondu Serg Sh 2018-04-10 18:29:32

si vous utilisez SslStream, alors vous devez explicitement définir la version TLS dans L'appel AuthenticateAsClient, par exemple:

ssl.AuthenticateAsClient(url, null, SslProtocols.Tls12, false);
0
répondu Fiach Reid 2018-08-16 11:35:03