NTE_BAD_KEYSET
NTE_BAD_KEYSET — это код ошибки, возникающий в операционных системах семейства Microsoft Windows при попытке доступа к криптографическому контейнеру (ключевому набору, keyset) с использованием неверных или несоответствующих параметров безопасности. Ошибка относится к категории системных ошибок, связанных с работой криптопровайдеров (CSP — Cryptographic Service Provider) и хранилищ сертификатов, и имеет числовой код 0x80090016 (или -2146893802 в десятичном представлении).
Причины возникновения
Ошибка NTE_BAD_KEYSET возникает, когда приложение или системный процесс пытается открыть, создать или использовать криптографический ключ (например, закрытый ключ сертификата), но сталкивается с несоответствием между запрашиваемыми и фактическими параметрами доступа. Основные причины включают:
- Недостаточные права доступа: пользователь или процесс, запускающий операцию, не имеет разрешения на чтение или запись в хранилище ключей. Это особенно актуально для системных служб, работающих от имени учётной записи LOCAL SYSTEM, NETWORK SERVICE или виртуальных учётных записей.
- Повреждение или отсутствие контейнера ключей: файлы, хранящие закрытые ключи (например, в папке
%APPDATA%\Microsoft\Crypto\RSAили%ALLUSERSPROFILE%\Microsoft\Crypto\RSA), могут быть удалены, перемещены или повреждены. - Несовместимость криптопровайдера: запрос ключа выполняется с указанием одного провайдера (например, Microsoft Base Cryptographic Provider v1.0), а реальный контейнер был создан другим провайдером (например, Microsoft Enhanced Cryptographic Provider v1.0).
- Конфликт версий операционной системы: на старых версиях Windows (до Windows 7) или при использовании устаревших криптографических библиотек может возникать несоответствие между форматом контейнера и ожидаемым форматом.
- Ошибки в программном коде: приложение может передавать неверные параметры (например, пустое имя контейнера, неверный флаг доступа или некорректный дескриптор безопасности).
Контекст возникновения
Ошибка NTE_BAD_KEYSET наиболее часто встречается в следующих сценариях:
Работа с сертификатами и цифровыми подписями
При попытке подписать документ, зашифровать данные или установить защищённое соединение (например, по протоколу HTTPS) приложение обращается к хранилищу сертификатов Windows. Если закрытый ключ, соответствующий сертификату, недоступен или повреждён, возникает данная ошибка. Это характерно для:
- Почтовых клиентов (Microsoft Outlook, Mozilla Thunderbird) при отправке подписанных или зашифрованных писем.
- Веб-браузеров при использовании клиентских сертификатов для аутентификации на сайтах.
- Программ электронного документооборота (например, «КриптоПро», «VipNet CSP»).
Разработка и тестирование ПО
Разработчики, использующие криптографические API Windows (CryptoAPI, CNG — Cryptography Next Generation), могут столкнуться с ошибкой при:
- Создании или импорте ключей в контейнер.
- Вызове функций
CryptAcquireContext,CryptGetUserKeyилиCryptSignHash. - Работе с провайдерами сторонних производителей (например, «КриптоПро CSP», «LISSI-CSP»).
Системные службы и удалённый доступ
Службы Windows, такие как служба сертификатов (Active Directory Certificate Services), служба удалённого рабочего стола (RDS) или служба IIS (Internet Information Services), могут генерировать ошибку при попытке использовать ключи для шифрования трафика или аутентификации.
Диагностика
Для выявления точной причины ошибки NTE_BAD_KEYSET используются следующие методы:
- Проверка журналов событий: в оснастке «Просмотр событий» (Event Viewer) разделы «Приложение» и «Система» могут содержать записи с кодом ошибки и дополнительными сведениями.
- Использование утилиты CertMgr.msc: консоль управления сертификатами позволяет просмотреть доступные сертификаты и их ключи. Если сертификат отображается с ошибкой (например, «Нет доступного закрытого ключа»), это указывает на проблему с контейнером.
- Команда certutil: утилита командной строки
certutil -keyвыводит список контейнеров ключей и их состояние. Параметр-repairstoreможет восстановить повреждённые записи. - Проверка прав доступа: с помощью проводника Windows или утилиты
icaclsможно проверить права на папки хранилищ ключей (например,C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys).
Решение проблемы
Методы устранения ошибки зависят от её причины и контекста:
Восстановление прав доступа
- Назначить необходимые разрешения учётной записи, под которой выполняется процесс, на папку с контейнерами ключей. Для этого в свойствах папки (например,
C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys) добавить учётную запись с правами «Чтение и выполнение» или «Полный доступ». - Для служб, работающих от имени виртуальных учётных записей (например,
NT SERVICE\TrustedInstaller), может потребоваться использование встроенных инструментов управления правами.
Переустановка или пересоздание сертификата
- Если проблема связана с конкретным сертификатом, его можно удалить из хранилища и импортировать заново (например, из файла
.pfxили.cer). - При импорте необходимо убедиться, что установлен флажок «Пометить ключ как экспортируемый» (если требуется дальнейшее использование).
Очистка и восстановление контейнеров
- Утилита
certutil -delkey <имя_контейнера>удаляет повреждённый контейнер, после чего приложение создаёт его заново при следующем обращении. - Команда
certutil -repairstore myпытается восстановить все сертификаты в хранилище «Личные».
Обновление криптопровайдера
- Установка последней версии криптопровайдера (например, обновление «КриптоПро CSP» до актуальной версии) может устранить несовместимость.
- Настройка приложения на использование правильного провайдера (например, замена Microsoft Base Cryptographic Provider на Microsoft Enhanced Cryptographic Provider).
Перезапуск служб
- Перезапуск службы «Службы криптографии» (Cryptographic Services) может временно решить проблему, если она вызвана сбоем в работе службы.
Связь с другими ошибками
NTE_BAD_KEYSET часто сопутствует другим криптографическим ошибкам, таким как:
- NTE_NO_KEY (0x8009000D) — ключ не найден в контейнере.
- NTE_BAD_KEYSET_PARAM (0x80090017) — неверный параметр контейнера.
- NTE_KEYSET_NOT_DEF (0x80090019) — контейнер не определён.
В некоторых случаях ошибка может быть следствием более общей проблемы с хранилищем сертификатов Windows, например, после обновления операционной системы или восстановления системы из резервной копии.
Профилактика
Для предотвращения возникновения ошибки NTE_BAD_KEYSET рекомендуется:
- Регулярно создавать резервные копии хранилищ сертификатов и ключей.
- Использовать только лицензионное и обновлённое программное обеспечение криптопровайдеров.
- Соблюдать принцип минимальных привилегий при настройке прав доступа к системным папкам.
- При разработке приложений корректно обрабатывать ошибки криптографических API и предусматривать восстановление контейнеров.
Источники
- Microsoft Docs: Cryptographic Functions — CryptAcquireContext
- Microsoft Support: Error code 0x80090016 (NTE_BAD_KEYSET)
- Документация криптопровайдера «КриптоПро CSP»: справочник ошибок
- Windows SDK: Cryptographic Service Providers (CSP)
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →