Как избежать доступа администратора для SslStream.AuthenticateAsClient?
У меня есть приложение, которое использует класс.NET SslStream вместе с сертификатами клиента и сервера. Это приложение прекрасно работает на Windows XP. Однако в Windows 7 (возможно, и в Vista), при вызове SslStream.AuthenticateAsClient появляется следующее исключение:
System.ComponentModel.Win32Exception: The credentials supplied to the package were not recognized
at System.Net.SSPIWrapper.AcquireCredentialsHandle(SSPIInterface SecModule, String package, CredentialUse intent, SecureCredential scc)
at System.Net.Security.SecureChannel.AcquireCredentialsHandle(CredentialUse credUsage, SecureCredential& secureCredential)
at System.Net.Security.SecureChannel.AcquireClientCredentials(Byte[]& thumbPrint)
at System.Net.Security.SecureChannel.GenerateToken(Byte[] input, Int32 offset, Int32 count, Byte[]& output)
at System.Net.Security.SecureChannel.NextMessage(Byte[] incoming, Int32 offset, Int32 count)
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)
Если приложение "запускается от имени администратора" в Windows 7, все отлично работает. Я предполагаю, что основная причина заключается в том, что AuthenticateAsClient нужен закрытый ключ для сертификата клиента (который установлен в хранилище личных сертификатов локального компьютера), а для этого действия требуется доступ администратора.
У меня вопрос: можно ли что-нибудь сделать, чтобы это исправить? Или это просто факт жизни, что использование AuthenticateAsClient с клиентским сертификатом требует прав администратора?
2 ответа
Вы пытались предоставить текущему пользователю права доступа к сертификату с помощью WinHttpCertCfg?
Что-то вроде:
winhttpcertcfg -g -c LOCAL_MACHINE\My -s MyCertificate -a TESTUSER
Для получения дополнительной информации см. Эту статью.
Консоль управления Microsoft (MMC) позволяет администраторам импортировать клиентские сертификаты на локальный компьютер. Однако импорт сертификата не дает автоматического доступа к закрытому ключу для других учетных записей. Этот закрытый ключ необходим для аутентификации сертификата клиента. Средство настройки сертификата Microsoft Windows HTTP Services (WinHTTP) предоставляет возможность при необходимости предоставлять доступ к дополнительным учетным записям, таким как учетная запись IWAM.
https://msdn.microsoft.com/en-us/library/aa384088(VS.85).aspx