CryptographicException "Набір клавіш не існує", а лише через WCF


157

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

Якщо я зателефоную безпосередньо коду (за допомогою тесту на одиницю), він працює без проблем.

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

Я припускаю, що це тому, що моя служба WCF намагатиметься викликати сторонні веб-сервіси, використовуючи іншого користувача.

Чи може хтось пролити якесь додаткове світло у цьому питанні?

Відповіді:


168

Можливо, це буде проблема з дозволом на сертифікат.

Під час виконання тесту на одиницю ви будете виконувати ті під власним контекстом користувача, які (залежно від того, в якому магазині знаходиться сертифікат клієнта ) матимуть доступ до приватного ключа цього сертифіката.

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

Вам потрібно буде встановити відповідні дозволи на приватному ключі, щоб дозволити доступ до цього облікового запису служби. MSDN має реквізити


Запуск calcs допоміг мені зовсім інше питання дякую
Джон

3
Я запускаю свою програму в якості адміністратора, проблема не зникає.
дерек

1
+1 для документації про MSDN та вказані кроки стосується навіть веб-програми
Нарен

Додавання "мережевої служби" до дозволів безпеки сертифіката вирішило це для мене, дякую!
OpMt

276

Це, швидше за все, тому, що користувач IIS не має доступу до приватного ключа для вашого сертифіката. Ви можете встановити це, виконавши ці кроки ...

  1. Старт -> Запуск -> MMC
  2. Файл -> Додати / видалити Snapin
  3. Додайте оснащення сертифікатів
  4. Виберіть Обліковий запис комп’ютера, а потім натисніть наступний
  5. Виберіть Місцевий комп'ютер (за замовчуванням), а потім натисніть кнопку Готово
  6. На лівій панелі від «Корінь консолі» перейдіть до Сертифікати (локальний комп'ютер) -> Особисті -> Сертифікати
  7. Ваш сертифікат, швидше за все, буде тут.
  8. Клацніть правою кнопкою миші ваш сертифікат -> Усі завдання -> Керування приватними ключами
  9. Установіть тут налаштування свого приватного ключа.

1
Варто зауважити, що це не є варіантом на сервері 2003, якщо моє середовище не налаштовано дурно. Я можу це зробити на Windows 7.
Шон Хаббард

що ви маєте на увазі під набором приватного ключа тут ?? Я маю на увазі, що ви можете додати користувача лише з правом доступу !?
mastervv

10
Дякую, я просто хотів зазначити, що якщо ви використовуєте iis7.5 і пул додатків працює як applicationpoolidentity, вам доведеться надати користувачеві дозволи IIS AppPool \ DefaultAppPool для файлу. Це вирішило для мене проблему.
Ronen Festinger

25
Мені довелося дати дозвіл на IIS_IUSRS, щоб він працював на мене.
TrueEddie

1
якщо ви отримуєте це під час запуску IIS express, вам потрібно надати власні дозволи на вхід.
Їжак

38

У мене була однакова проблема минулої ночі. Дозволи на приватний ключ були встановлені правильно, все, здавалося б, добре, за винятком помилки Keyset, не існує помилки. Врешті-решт виявилося, що сертифікат був імпортований спочатку в магазин поточного користувача, а потім переміщений до місцевого магазину. Однак - це не перемістило приватний ключ, який все ще був у

C: \ Документи та налаштування \ Адміністратор ...

замість

C: \ Документи та налаштування \ Усі користувачі ...

Хоча дозволи на ключ були встановлені правильно, ASPNET не міг отримати доступ до нього. Коли ми повторно імпортували сертифікат, щоб приватний ключ був розміщений у відділенні Усі користувачі, проблема зникла.


Та ж проблема. Майкрософт повинен припинити давати бозові служби безпеки притулку.
Пол Стовелл

2
Після 3 втрачених годин це вирішує мою проблему - Дякую. Я використовував зразок FindPrivateKey і був розгублений, чому він виявився в магазині ключів мого користувача, навіть коли він з'явився в LocalMachine через оснащення MMC.
Роб Поттер

Я б купив тобі пиво за витрачені години, возившись з дозволами, як і будь-яка інша відповідь, яку мені казали.
Скотт Скоуден

Спасибі, дякую! Я втратив близько 2,5 годин свого життя завдяки цій жахливій проблемі, і я впевнений, що втратив би 2,5 дня, якби цього не бачив.
Френк Цзанабетіс

У мене була така сама проблема і в зворотному напрямку. Спочатку встановлюється в локальній машині, потім у поточному користувачі. Видалення всіх сертів з обох магазинів та перевстановлення під поточним користувачем виправлено.
Барт Веркойєн

24

Щоб вирішити "Набір клавіш не існує" під час перегляду IIS: це може бути для приватного дозволу

Щоб переглянути та дати дозвіл:

  1. Виконати> mmc> так
  2. натисніть на файл
  3. Клацніть на Додати / видалити оснащення…
  4. Двічі клацніть на сертифікаті
  5. Обліковий запис комп’ютера
  6. Далі
  7. Закінчити
  8. Гаразд
  9. Клацніть на сертифікати (локальний комп'ютер)
  10. Клацніть на Особисті
  11. Клацніть Сертифікати

Щоб надати дозвіл:

  1. Клацніть правою кнопкою миші на назві сертифіката
  2. Усі завдання> Керування приватними ключами ...
  3. Додайте та надайте привілей (додавання IIS_IUSRS та надання йому привілею працює для мене)

1
Якщо ви працюєте в пулі додатків, додайте цього користувача замість "IIS AppPool \ DefaultAppPool"
Sameer Alibhai

Це мені теж допомогло. Як тільки я дав дозволи IIS_IUSRS, він почав працювати.
Андрій Мохар

18

Була така ж проблема при спробі запустити додаток WCF від Visual Studio. Вирішили це, запустивши Visual Studio як адміністратор.


11

Я зіткнувся з цією проблемою, моїми сертифікатами, де мав приватний ключ, але я отримував цю помилку ( "Keyset не існує" )

Причина: Ваш веб-сайт працює в обліковому записі "Мережеві послуги" або має менше привілеїв.

Рішення : Змініть ідентифікацію пулу додатків на "Локальна система", скиньте IIS і перевірте ще раз. Якщо він почне працювати, це дозвіл / Менш привілей, ви можете себе представити, використовуючи й інші облікові записи.


8

Цілковито засмучуючи, у мене було те саме питання, і я спробував більшу частину вище. Експортований сертифікат правильно мав права читати файл C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys, проте, як виявляється, у нього не було дозволу на папку. Додав це і спрацювало


Я так багато намагався вирішити цю проблему, але ця зробила трюк!
Gyum Fox

вау - НЕ очікував, що це спрацює, але це зробило. Я додав, IISAPPPool\www.mywebsite.comяке є ім’ям Windows для мого appool, і воно спрацювало :-)
Simon_Weaver

хтось знає, чому це працює? щось пошкоджене, тому що це досить незрозуміло
Simon_Weaver

Не робіть цього! Сервер переходить у "поганий стан", де імпортуються серти і відображаються з типом постачальника "Microsoft Software KSP", коли папка ..RSA \ MachineKeys змінила базові дозволи. Детальніше reddit.com/r/sysadmin/comments/339ogk / ... .
Dhanuka777

3

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

findprivatekey root localmachine -n "CN="CertName" 

в результаті видно, що приватний ключ знаходиться в папці c: \ ProgramData замість C: \ Документи та розміщення \ Усі користувачі ..

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

Але якщо я шукаю той самий ключ, повернутий попередньою командою, я все одно можу знайти ключ у

C: \ Документи та налаштування \ Усі користувачі ..

Наскільки я розумію, IIS або розміщений WCF не знаходить приватного ключа від C: \ Документи та встановлює \ Усі користувачі ..


2
Привіт це посилання буде сказати вам , як вирішити цю проблему , а також знайти findprivatekey інструмент: blogs.msdn.microsoft.com/dsnotes/2015/08/13 / ...
Тахір Халід

3

Я отримував помилку: CryptographicException "Keyset не існує" під час запуску програми 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. 

2

Відповідь від Стіва Шелдона вирішила проблему для мене, однак, оскільки я переглядаю дозволи на отримання сертифіката з гуї, мені було потрібно рішення, що написано в сценарії. Я намагався знайти місце зберігання мого приватного ключа. Приватного ключа не було -C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys, врешті я виявив, що він насправді є C:\ProgramData\Microsoft\Crypto\Keys. Нижче я описую, як я це з'ясував:

Я спробував, FindPrivateKeyале він не зміг знайти приватний ключ, і за допомогою powershell the $cert.privatekey.cspkeycontainerinfo.uniquekeycontainernamewas null / empty.

На щастя, certutil -store myперерахував сертифікат і дав мені реквізити, необхідні для сценарію рішення.

================ Certificate 1 ================ Serial Number: 162f1b54fe78c7c8fa9df09 Issuer: CN=*.internal.xxxxxxx.net NotBefore: 23/08/2019 14:04 NotAfter: 23/02/2020 14:24 Subject: CN=*.xxxxxxxnet Signature matches Public Key Root Certificate: Subject matches Issuer Cert Hash(sha1): xxxxa5f0e9f0ac8b7dd634xx Key Container = {407EC7EF-8701-42BF-993F-CDEF8328DD} Unique container name: 8787033f8ccb5836115b87acb_ca96c65a-4b42-a145-eee62128a ##* ^-- filename for private key*## Provider = Microsoft Software Key Storage Provider Private key is NOT plain text exportable Encryption test passed CertUtil: -store command completed successfully.

Потім я просканував c\ProgramData\Microsoft\Crypto\папку і знайшов файл 8787033f8ccb5836115b87acb_ca96c65a-4b42-a145-eee62128a в C: \ ProgramData \ Microsoft \ Crypto \ Keys .

Надання мого облікового запису служби читання доступу до цього файлу вирішило проблеми


1
Використання "certutil -store my" було ключовим для вирішення моєї проблеми. Я використовував "Унікальне ім'я контейнера", щоб знайти файл і монітор процесів Sysinternals, щоб усунути помилку "Доступ заборонено" у файлі сертифіката. У моєму випадку я повинен був забезпечити доступ для читання до файлу сертифікатів для користувача NT Authority \ IUSR.
hsop

1

Я знайшов дефіцит інформації, яка допомогла мені отримати сервіс WCF із захистом рівня повідомлень минулого рівня "Клавіатури не існує", на яку я продовжував працювати, незважаючи на надання дозволу на всі ключі, згенеровані з прикладів в Інтернеті.

Нарешті я імпортував приватний ключ у магазин надійних людей на локальній машині, а потім надав приватному ключу правильні дозволи.

Це заповнило пробіли для мене і, нарешті, дозволило мені реалізувати послугу WCF із захистом рівня повідомлень. Я будую WCF, який повинен відповідати HIPPA.


1

Я просто перевстановив свій сертифікат на локальну машину і тоді він працює нормально


0

Якщо ви використовуєте ApplicationPoolIdentity для пулу додатків, у вас може виникнути проблеми із зазначенням дозволу для цього "віртуального" користувача в редакторі реєстру (у системі такого користувача немає).

Отже, використовуйте subinacl - інструмент командного рядка, який дозволяє встановити ACL реєстру, або щось подібне.


0

Я просто хотів додати відповідь на перевірку здорового стану. Я отримував таку саму помилку навіть після встановлення сертифікатів у потрібні магазини на своїх машинах та отримання всіх потрібних привілеїв безпеки для клієнта. Виявляється, я змішав мій сертифікат client і мій сертифікат на обслуговування. Якщо ви спробували все вищезазначене, я б ще раз перевірив, чи є у вас ці два прямо. Як тільки я це зробив, моя програма успішно викликала веб-службу. Знову ж таки, просто перевірка.


0

Отримала цю помилку під час використання FedAM openAM на IIS7

Зміна облікового запису користувача для веб-сайту за замовчуванням вирішила проблему. В ідеалі, ви хочете, щоб це був обліковий запис служби. Можливо, навіть рахунок IUSR. Запропонуйте шукати методи загартовування IIS, щоб повністю зняти його.


0

Я потрапив на це у своєму проекті службової тканини після того, як сертифікат, який використовується для автентифікації проти нашого ключового склепіння, закінчився та повернувся, що змінило відбиток пальця. Я отримав цю помилку, тому що я пропустив оновлення відбитків пальців у файлі applicationManifest.xml у цьому блоці, який точно відповідає тому, що запропоновано інші відповіді - на надану мережеву службу (на яку працюють усі мої exe, стандартну конфігурацію для кластера azure servicefabric) до отримати доступ до місця зберігання в магазині LOCALMACHINE \ MY.

Зверніть увагу на значення атрибута "X509FindValue".

<!-- this block added to allow low priv processes (such as service fabric processes) that run as NETWORK SERVICE to read certificates from the store -->
  <Principals>
    <Users>
      <User Name="NetworkService" AccountType="NetworkService" />
    </Users>
  </Principals>
  <Policies>
    <SecurityAccessPolicies>
      <SecurityAccessPolicy ResourceRef="AzureKeyvaultClientCertificate" PrincipalRef="NetworkService" GrantRights="Full" ResourceType="Certificate" />
    </SecurityAccessPolicies>
  </Policies>
  <Certificates>
    <SecretsCertificate X509FindValue="[[THIS KEY ALSO NEEDS TO BE UPDATED]]" Name="AzureKeyvaultClientCertificate" />
  </Certificates>
  <!-- end block -->


0

Це єдине для мене рішення, яке працювало.

    // creates the CspParameters object and sets the key container name used to store the RSA key pair
    CspParameters cp = new CspParameters();
    cp.KeyContainerName = "MyKeyContainerName"; //Eg: Friendly name

    // instantiates the rsa instance accessing the key container MyKeyContainerName
    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp);
    // add the below line to delete the key entry in MyKeyContainerName
    // rsa.PersistKeyInCsp = false;

    //writes out the current key pair used in the rsa instance
    Console.WriteLine("Key is : \n" + rsa.ToXmlString(true));

Довідка 1

Довідка 2


0
This issue is got resolved after adding network service role.

CERTIFICATE ISSUES 
Error :Keyset does not exist means System might not have access to private key
Error :Enveloped data  
Step 1:Install certificate in local machine not in current user store
Step 2:Run certificate manager
Step 3:Find your certificate in the local machine tab and right click manage privatekey and check in allowed personnel following have been added:
a>Administrators
b>yourself
c>'Network service'
And then provide respective permissions.

## You need to add 'Network Service' and then it will start working.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.