.NET Socket クラスを使用してホストに定期的に接続する Windows サービスがあります。これは、SMTP プロトコルを使用した標準の TCP/IP 接続です。
接続は、スマートカードに保存されている証明書で保護されています。私は SslStream クラスを使用して SSL を処理しています。
これはほとんどの場合機能します。しかし、ランダムな時点で、認証は失敗します。次のエラーが表示されます。
A call to SSPI failed, see inner exception.
Error type:
System.Security.Authentication.AuthenticationException
Server stack trace:
at System.Net.Security.SslState.EndProcessAuthentication(IAsyncResult result)
at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)
内部例外:
System.ComponentModel.Win32Exception
The Local Security Authority cannot be contacted
試行が失敗した後、AuthenticationExcpetion は残りますが、内部の例外が変更されます。
A signature operation must be performed before the user can authenticate
この時点で、サービスを再起動する必要があり、問題なく接続できるようになりました。SSL ハンドシェイクは、エラーが再び発生するまでしばらくの間 (場合によっては数日) 機能します。