Сбой вызова SSPI, см. Внутреннее исключение - невозможно связаться с локальным органом безопасности

У меня есть приложение WPF, которое использует SSLStream для подключения к серверу и отправки/получения некоторых сообщений. Мой код в значительной степени основан на этом примере (SslTcpClient): https://msdn.microsoft.com/en-us/library/system.net.security.sslstream(v=vs. 110).aspx.

это работало нормально в течение нескольких месяцев. Однако после получения этого обновления windows (Накопительное обновление для Windows 10 версии 1511 и Windows Server 2016 Technical Preview 4: 14 июня 2016 г - https://support.microsoft.com/en-us/kb/3163018). Мое приложение начало сообщать об этом исключении:

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)

что я могу сделать ?

3 ответов


вот решение, установленное в реестре:

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

Как отмечает здесь


это означает, что другая сторона использует другую версию TLS, и вы используете более старую версию.
Перед подключением настройте атрибут безопасности TLS12. Это широко известная проблема,так как многие поставщики начинают использовать TLS12 (например, paypal, amazon и т. д.).

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

Если вы используете SslStream, то вам нужно явно установить версию TLS в вызове AuthenticateAsClient, например:

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