Проблема с сертификатом на новом компьютере - учетные данные, предоставленные в пакет, не распознаны

StackOverflow https://stackoverflow.com/questions/2322560

Вопрос

Я устанавливаю службу Windows на новый компьютер.Служба выполняет различные операции через SslStream по протоколу TCP, который использует сертификат в problem.

Служба работала нормально с тем же кодом и тем же сертификатом на других 2 компьютерах с Windows 2003.Но эта новая машина тоже работает под управлением Windows 2003 с 64-разрядным процессором.

Я сталкиваюсь с этой проблемой, когда пытаюсь запустить службу с идентификатором "Учетной записи службы".Это прекрасно работает с моими собственными учетными данными.(Опять же, это отлично работает на других 2 машинах с этой учетной записью службы)

У меня не включена "надежная защита" при импорте сертификата.

Вот трассировка стека.

Система.ComponentModel.Win32Exception:Учетные данные, предоставленные в пакет, не были распознаны в System.Net.SSPIWrapper.AcquireCredentialsHandle(SSPIInterface SecModule, пакет строк, Намерение использовать учетные данные, SecureCredential scc) в System.Net.Security.SecureChannel.Приобретите Credentialshandle(CredentialUse credUsage, SecureCredential& secureCredential) в System.Net.Security.SecureChannel.Приобретайте учетные данные клиента (байт[] и Отпечаток большого пальца) в System.Net.Security.SecureChannel.GenerateToken(Byte[] ввод, смещение Int32, количество Int32, Байт[] и вывод) в System.Net.Security.SecureChannel.NextMessage (Байт[] входящий, смещение Int32, количество Int32)
в System.Net.Security.SslState.StartSendBlob(байт[] входящий, количество Int32, AsyncProtocolRequest asyncRequest)
в System.Net.Security.SslState.ProcessReceivedBlob(байт[] буфер, количество Int32, AsyncProtocolRequest asyncRequest)
в System.Net.Security.SslState.StartReadFrame(байт[] буфер, Int32 байта чтения, AsyncProtocolRequest asyncRequest)
в System.Net.Security.SslState.StartReceiveBlob(байт[] буфер, AsyncProtocolRequest asyncRequest) в System.Net.Security.SslState.Проверьте выполнение beforenextreceive(ProtocolToken сообщение, AsyncProtocolRequest asyncRequest) в System.Net.Security.SslState.StartSendBlob(байт [] входящий, число Int32, AsyncProtocolRequest Асинхронный запрос)
в System.Net.Security.SslState.Принудительная проверка подлинности (логическое значение receiveFirst, буфер Байт[], AsyncProtocolRequest asyncRequest)
на System.Net.Security.SslState.Проверка подлинности процесса (LazyAsyncResult lazyResult) на System.Net.Security.SslStream.AuthenticateAsClient(строка targetHost, X509CertificateCollection ClientCertificates, SslProtocols enabledSslProtocols, логическое значение Проверьте certificaterevocation)

Это было полезно?

Решение

Я нашел проблему и ее решение.

Идея состоит в том, чтобы предоставить разрешения учетной записи, которая используется для идентификации службы.

Нужно использовать инструмент WinHttpCertCfg.exe.Это полезно для приложений, использующих клиентские сертификаты для получения авторизации.

Это прекрасно объяснено здесь.http://support.microsoft.com/kb/901183

Спасибо Ферозе Дауд (http://ferozedaud.blogspot.com/), который ответил мне на другом форуме.

Другие советы

У меня была эта проблема как при запуске под учетной записью ASP.NET, так и при использовании службы Windows (под учетной записью локальной системы).Если вы работаете под управлением ASP.NET, для Windows 2003 вам необходимо использовать инструмент WinHttpCertCfg.exe, описанный cdpnet выше.Windows 2008 R2 позволяет вам получать доступ к правам с помощью графического интерфейса, что является приятным улучшением.

Однако при запуске от имени службы Windows вам необходимо убедиться, что сертификат находится в хранилище персональных сертификатов, зайдя в mmc и добавив оснастку "Сертификат" либо для учетной записи службы Windows, либо, если вы используете учетную запись "Локальная система", просто получите оснастку для локального компьютера.

Вот разница, которую я нашел...

Если вы установили персональный сертификат в хранилище сертификатов вашего собственного пользователя и скопировали и вставили его в хранилище локальных компьютеров, это не всегда работает.Однако, если вы удалите сертификат из локального хранилища компьютеров, личная папка, вы можете щелкнуть правой кнопкой мыши личную папку в локальном хранилище компьютеров, затем импортировать и пройти через мастер.

По какой-то причине это исправляет проблему и назначает правильные разрешения для использования сертификата.Удачи вам!

Я делал то, что здесь описано для сервера Win 2003, и все еще не мог заставить его работать из-за mssg "учетные данные, предоставленные в пакет, не распознаны".

Я перепробовал все вышеперечисленные решения, но безуспешно.

Наконец я заставил это работать, выполнив следующее:

  1. makecert -pe -n "CN= СЕРТИФИКАТ" -ss my -sr LocalMachine -обмен sha1 -sky -eku 1.3.6.1.5.5.7.3.1 -в "СЕРТИФИКАТЕ" -это MY -ir LocalMachine -sp "Поставщик криптографических услуг Microsoft RSA SChannel" -сертификат sy 12.cer
  2. Использование MMC-копирования с личного на Доверенный Root
  3. Используйте сгенерированный сертификат (.cer) для вызова X509 из вашего сервисного приложения.

ПОЧЕМУ...кто знает ..... рад, что у меня это сработало .... надеюсь, это облегчит задачу другим

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top