Избегать доступа администратора для 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 с клиентским сертификатом требуются права администратора?


person zdv    schedule 11.11.2010    source источник


Ответы (2)


Вы пытались предоставить текущему пользователю права доступа к сертификату с помощью WinHttpCertCfg?

Что-то типа:

winhttpcertcfg -g -c LOCAL_MACHINE\My -s MyCertificate -a TESTUSER

Дополнительные сведения см. в этой статье.

person Richard Smith    schedule 16.11.2010
comment
Это идеально и именно то, что я искал!! - person zdv; 18.11.2010
comment
Незначительное примечание; можно использовать -C CURRENT_USER\TrustedPublisher без пробела между Trusted и Publisher. Не Trusted_Publisher или CURRENT_USER\Trusted Publisher. Спасибо WinHttpCertCfg за молчаливое игнорирование моих ошибок. - person Ian Quigley; 21.06.2013

Консоль управления Microsoft (MMC) позволяет администраторам импортировать клиентские сертификаты на локальный компьютер. Однако импорт сертификата не предоставляет автоматически доступ к закрытому ключу для других учетных записей. Этот закрытый ключ требуется для проверки подлинности клиентского сертификата. Инструмент настройки сертификатов Microsoft Windows HTTP Services (WinHTTP) позволяет при необходимости предоставить доступ к дополнительным учетным записям, таким как учетная запись IWAM.

https://msdn.microsoft.com/en-us/library/aa384088(VS.85).aspx#_using

person Slogger    schedule 17.02.2015