web-dev-qa-db-ja.com

SSPIの呼び出しに失敗しました。内部例外を参照してください-ローカルセキュリティ機関に接続できません

SSLStreamを使用してサーバーに接続し、いくつかのメッセージを送受信するWPFアプリがあります。私のコードはこの例(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:2016年6月14日の累積更新プログラム- 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)

私に何ができる ?

20
Milan Milanovic

レジストリに設定されたソリューションは次のとおりです。

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

前述のとおり ここ

10
Milan Milanovic

これは、相手側が別のバージョンのTLSを使用しており、古いバージョンを使用していることを意味します。
接続を行う前に、セキュリティ属性をTLS12に設定します。多くのプロバイダーがTLS12(Paypal、Amazonなど)の使用を開始しているため、これは広く知られている問題です。

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
12
Serg Sh

SslStreamを使用している場合は、AuthenticateAsClient呼び出しでTLSバージョンを明示的に設定する必要があります。次に例を示します。

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