CryptographicException «Набор ключей не существует», но только через WCF - PullRequest
146 голосов
/ 02 марта 2009

У меня есть код для вызова сторонней веб-службы, которая защищена с помощью сертификации X.509.

Если я вызываю код напрямую (с помощью модульного теста), он работает без проблем.

При развертывании этот код будет вызываться через службу WCF. Я добавил второй модульный тест, который вызывает службу WCF, однако он завершается неудачно с сообщением CryptographicException, "Keyset does not exist", когда я вызываю метод в сторонней веб-службе.

Я предполагаю, что это потому, что моя служба WCF будет пытаться вызвать стороннюю веб-службу, используя другого пользователя для меня.

Может кто-нибудь пролить дополнительный свет на эту проблему?

Ответы [ 15 ]

262 голосов
/ 05 июля 2010

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

  1. Пуск -> Выполнить -> MMC
  2. Файл -> Добавить / Удалить Snapin
  3. Добавить оснастку сертификатов
  4. Выберите учетную запись компьютера, затем нажмите
  5. Выберите Локальный компьютер (по умолчанию), затем нажмите Готово
  6. На левой панели из корневого каталога консоли перейдите к Сертификаты (локальный компьютер) -> Личные -> Сертификаты
  7. Ваш сертификат, скорее всего, будет здесь.
  8. Щелкните правой кнопкой мыши по своему сертификату -> Все задачи -> Управление личными ключами
  9. Установите здесь настройки вашего личного ключа.
163 голосов
/ 02 марта 2009

Вероятно, это проблема с разрешениями в сертификате.

При запуске модульного теста вы будете выполнять те из них в своем собственном пользовательском контексте, который (в зависимости от того, в каком хранилище находится сертификат client ) будет иметь доступ к закрытому ключу этого сертификата.

Однако, если ваша служба WCF размещена в IIS или в качестве службы Windows, скорее всего, она будет работать под учетной записью службы (сетевая служба, локальная служба или какая-либо другая ограниченная учетная запись).

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

38 голосов
/ 07 декабря 2009

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

C: \ Документы и расчеты \ Администратор ...

вместо

C: \ Документы и расчеты \ Все пользователи ...

Хотя права доступа к ключу установлены правильно, ASPNET не может получить к нему доступ. Когда мы повторно импортировали сертификат, чтобы закрытый ключ помещался в ветку «Все пользователи», проблема исчезла.

21 голосов
/ 30 августа 2016

Чтобы решить «Набор ключей не существует» при просмотре из IIS: Может быть для частного разрешения

Для просмотра и предоставления разрешения:

  1. Run> ММС> да
  2. нажмите на файл
  3. Нажмите Добавить / удалить оснастку…
  4. Двойной щелчок по сертификату
  5. Учетная запись компьютера
  6. Далее
  7. Конец
  8. Ok
  9. Нажмите на сертификаты (локальный компьютер)
  10. Нажмите на Личное
  11. Нажмите Сертификаты

Чтобы дать разрешение:

  1. Щелкните правой кнопкой мыши по названию сертификата
  2. Все задачи> Управление личными ключами…
  3. Добавить и дать привилегию (добавление IIS_IUSRS и предоставление ей привилегии работает для меня)
16 голосов
/ 12 января 2014

Возникла такая же проблема при попытке запустить приложение WCF из Visual Studio. Решил это, запустив Visual Studio от имени администратора.

10 голосов
/ 09 июля 2013

Я сталкивался с этой проблемой, в моих сертификатах был закрытый ключ, но я получал эту ошибку ( "Набор ключей не существует" )

Причина: Ваш веб-сайт работает под учетной записью "Сетевые службы" или имеет меньше привилегий.

Решение : Измените удостоверение пула приложений на «Локальная система», сбросьте IIS и проверьте снова. Если он начинает работать, это проблема с правами / меньшими привилегиями, вы можете выдать себя за другого, а затем использовать другие учетные записи.

8 голосов
/ 17 июля 2013

Совершенно разочаровывает, у меня была та же проблема, и я пробовал большинство из вышеперечисленных. Экспортированный сертификат правильно имел права на чтение файла в C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys, однако, как оказалось, у него не было разрешения на папку. Добавил и все заработало

3 голосов
/ 23 августа 2016

Я получаю сообщение об ошибке: CryptographicException «Набор ключей не существует» при запуске приложения MVC.

Решением было: предоставить доступ к личным сертификатам учетной записи, под которой работает пул приложений. В моем случае это было добавление IIS_IUSRS, и выбор правильного местоположения решил эту проблему.

RC on the Certificate - > All tasks -> Manage Private Keys -> Add->  
For the From this location : Click on Locations and make sure to select the Server name. 
In the Enter the object names to select : IIS_IUSRS and click ok. 
3 голосов
/ 25 октября 2012

У меня точно такая же проблема. Я использовал команду

findprivatekey root localmachine -n "CN="CertName" 

результат показывает, что закрытый ключ находится в папке c: \ ProgramData вместо C: \ Documents andundngs \ All users ..

Когда я удаляю ключ из папки c: \ ProgramData, снова выполнить команду findPrivatekey не удается. то есть. он не находит ключ.

Но если я найду тот же ключ, возвращенный предыдущей командой, я все равно смогу найти ключ в

C: \ Документы и расчеты \ Все пользователи ..

Поэтому, насколько я понимаю, IIS или размещенный WCF не находят закрытый ключ в C: \ Documents andundngs \ All users ..

1 голос
/ 26 июня 2012

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

Я наконец импортировал закрытый ключ в хранилище доверенных лиц на локальном компьютере, а затем предоставил закрытому ключу правильные разрешения.

Это заполнило пробелы для меня и, наконец, позволило мне реализовать службу WCF с безопасностью на уровне сообщений. Я строю WCF, который должен быть совместимым с HIPPA.

...