Невозможно получить разрешения на закрытый ключ в службе WCF - PullRequest
3 голосов
/ 02 февраля 2011

Я получаю сообщение об ошибке "Сертификат 'CN = tempcert' должен иметь закрытый ключ, способный к обмену ключами. Процесс должен иметь права доступа к закрытому ключу", когда я запускаю службу WCF на Win7 с использованием HTTP. Я изменяю пул приложений, чтобы использовать «NetworkService». Я установил сертификат сервера, используя Локальный компьютер. Сертификат отображается в сертификате MMC в разделе «Локальный компьютер / Персональный / Сертификаты». Я дважды щелкаю на сертификате, и он заявляет, что у него есть закрытый ключ. Затем я запускаю утилиту FindPrivateKey и заявляет, что находит закрытый ключ в папке C: \ ProgramData \ Microsoft \ Crypto \ RSA \ MachineKeys. Я зашел в Надстройку сертификатов в MMC и получил полные права на учетную запись NETWORK SERVICE. Затем я зашел в папку в Windows Explorer и подтвердил, что NETWORK SERVICE обладает полными правами на папку и конкретный файл ключа. Однако каждый раз, когда я запускаю службу WCF, она выдает ошибку, что не может найти закрытый ключ. Я понятия не имею, что еще я могу сделать.

Ответы [ 4 ]

4 голосов
/ 03 мая 2013

Я тоже с этим боролся.Там нет быстрого решения.«-Sky exchange» может быть причиной этой ошибки, но я установил «-sky exchange» при создании самозаверяющих сертификатов и все еще получал эту ошибку.Есть другие проблемы, которые могут вызвать эту проблему, включая права доступа к закрытому ключу и местоположение сертификата.

Это может применяться, если / когда вы используете хост WCF в качестве службы Windows:

Права доступа к закрытому ключу В моем случае, если я запустилСлужба WCF вручную, она унаследовала права моей учетной записи (группы администраторов), и служба WCF без проблем нашла сертификаты.Но когда я использовал службу Windows для запуска узла WCF, он унаследовал права службы, и я получил эту же ошибку.

В моем окне Service Manager, в моем случае, учетная запись, в которой запущен мой сервис, отображается как «Локальная система», что в действительности означает «NT AUthority / System».Поэтому мне нужно было предоставить этой учетной записи права доступа к контейнеру закрытого ключа для этой учетной записи.«Все» не были достаточно хороши, удивительно.Вы можете назначить права на хранилище ключей, используя MMC или usign FindPrivatekey.exe и вручную, используя проводник для установки прав, так же, как вы устанавливаете права доступа к папке с файлами.

Местоположение магазина - еще один фактор Кроме того, в моем случае учетная запись, под которой я работал, не имела доступа к хранилищам "LocalMachine" или "CurrentUser", поэтому я нашел там свои сертификатыбыл бесполезен.Служба начала работать только после того, как я импортировал (или скопировал) сертификаты в «Служба (Имя службы)» с помощью MMC.

Вы можете сделать это следующим образом: открыть MMC, затем выбрать «Сертификаты» из списка.Вы увидите три варианта: Моя учетная запись пользователя (CurrentUser), Сервисная учетная запись (вы выбираете какую службу) и Компьютерная учетная запись (LocalMachine).Просто выберите Сервисная учетная запись и выберите сервис, под которым работает ваш хост WCF.

Мой ответ здесь был не для того, чтобы быть полным «как», а для того, чтобы помочь тем, кто борется с этой проблемой.«Как», которое я написал для своей документации, было длиной в 10 страниц.

4 голосов
/ 02 февраля 2011

Вам необходимо указать -sky exchange при создании сертификата.

makecert -sk SignedByCA -iv TempCA.pvk -n "CN=localhost" -ic 
    TempCA.cer SignedByCA.cer -sr LocalMachine -ss My -sky exchange -pe
2 голосов
/ 25 марта 2014

mmc> Файл> Добавить / удалить оснастку> Сертификат> Добавить> Учетная запись компьютера> Далее> Готово> OK

Затем найдите сертификат> Щелкните правой кнопкой мыши> Все задачи> Управление личными ключами

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

У вас все настроено :) Перезапустите сервис, и он должен работать

0 голосов
/ 25 ноября 2015

Я тоже получал это исключение.Проверка внутреннего исключения показала: System.Security.Cryptography.CryptographicException: Invalid provider type specified. Оказывается, я использовал сертификат CNG в .NET 3.5 на Windows Server 2008, который в этой статье (https://msdn.microsoft.com/en-us/library/aa738624(v=vs.100).aspx) выделен как неподдерживаемый.

Для просмотракакой тип сертификата вы используете, вы можете запустить команду Certutil -store my и найти поле Provider .

  • Если оно говорит Microsoft Enhanced Cryptographic Provider v1.0 - тогда это сертификат CSP.
  • Там написано Поставщик хранилища ключей программного обеспечения Microsoft - тогда это сертификат CNG (KSP).

В любом случаеНадеюсь, эта информация будет полезна для тех, у кого такие же проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...