Открыть сервис

CertOpenStore

CertOpenStore — это функция Windows CryptoAPI (Cryptographic Application Programming Interface), предназначенная для открытия хранилища сертификатов (certificate store) в операционной системе Microsoft Windows. Функция является частью низкоуровневого интерфейса для работы с криптографическими объектами и позволяет получить дескриптор (HCERTSTORE) для доступа к сертификатам, спискам отзыва сертификатов (CRL) и контекстам политик сертификации (CTL). CertOpenStore обеспечивает единообразный доступ к различным типам хранилищ: системным (физическим и логическим), файловым, реестровым, а также к хранилищам, создаваемым сторонними провайдерами (коллекциями).

История

Функция CertOpenStore была введена в Windows 2000 как часть CryptoAPI 2.0. До этого момента работа с сертификатами в Windows осуществлялась через более ранние версии API (например, CertOpenSystemStore), которые имели ограниченную функциональность. С появлением CertOpenStore разработчики получили возможность указывать тип хранилища (dwStoreProvider), параметры открытия (dwFlags) и дополнительные параметры (pvPara), что сделало интерфейс более гибким. В последующих версиях Windows (XP, Vista, 7, 10, 11) функция подвергалась незначительным изменениям, связанным с поддержкой новых типов хранилищ (например, для смарт-карт и аппаратных модулей безопасности) и улучшением безопасности (добавление флагов для проверки подписи файлов хранилищ).

Синтаксис и параметры

Функция объявлена в заголовочном файле wincrypt.h (библиотека crypt32.lib). Прототип на языке C:

``c HCERTSTORE CertOpenStore( LPCSTR lpszStoreProvider, DWORD dwEncodingType, HCRYPTPROV_LEGACY hCryptProv, DWORD dwFlags, const void *pvPara ); ``

Параметры

  • lpszStoreProviderуказатель на строку, определяющую тип провайдера хранилища. Стандартные значения:
  • sz_CERT_STORE_PROV_SYSTEM — системное хранилище (например, «MY», «CA», «ROOT»).
  • sz_CERT_STORE_PROV_FILE — хранилище, загружаемое из файла (.p7b, .p12, .pfx).
  • sz_CERT_STORE_PROV_REG — хранилище в реестре Windows.
  • sz_CERT_STORE_PROV_MEMORY — хранилище в оперативной памяти.
  • sz_CERT_STORE_PROV_PHYSICAL — физическое хранилище (реализация логического хранилища на диске).
  • dwEncodingType — тип кодирования сертификатов (обычно PKCS_7_ASN_ENCODING | X509_ASN_ENCODING).
  • hCryptProv — дескриптор криптографического провайдера (CSP). Для большинства случаев используется 0 (NULL), что означает использование провайдера по умолчанию.
  • dwFlags — флаги, управляющие поведением функции:
  • CERT_STORE_OPEN_EXISTING_FLAG — открыть только существующее хранилище; не создавать новое.
  • CERT_STORE_READONLY_FLAG — открыть в режиме только для чтения.
  • CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAG — отложить закрытие хранилища до освобождения последнего сертификата.
  • CERT_STORE_DELETE_FLAG — удалить хранилище после открытия (используется для очистки).
  • pvPara — дополнительные параметры, зависящие от типа провайдера. Для системного хранилища — имя хранилища (например, «MY»), для файлового — путь к файлу, для памяти — NULL.

Возвращаемое значение

При успешном выполнении функция возвращает дескриптор открытого хранилища (HCERTSTORE). В случае ошибки возвращается NULL; код ошибки можно получить с помощью GetLastError().

Типы хранилищ

Системные хранилища

Системные хранилища делятся на логические и физические. Логические хранилища (например, «MY» для личных сертификатов, «CA» для центров сертификации, «ROOT» для доверенных корневых центров) являются виртуальными и могут состоять из нескольких физических хранилищ (реестровых, файловых, групповых политик). При открытии системного хранилища с помощью sz_CERT_STORE_PROV_SYSTEM функция автоматически объединяет все физические компоненты.

Файловые хранилища

Файловые хранилища поддерживают форматы:

  • .p7b (PKCS#7) — контейнер сертификатов и CRL.
  • .p12 / .pfx (PKCS#12) — контейнер с закрытым ключом и сертификатом.
  • .stl (сертификатный список доверия).
  • .sst (сериализованное хранилище).

Хранилища в памяти

Хранилища в памяти (sz_CERT_STORE_PROV_MEMORY) создаются в оперативной памяти и не сохраняются на диск. Используются для временного хранения сертификатов в процессе их обработки.

Провайдеры коллекций

Провайдер коллекций (sz_CERT_STORE_PROV_COLLECTION) позволяет объединить несколько хранилищ в одно логическое. Это полезно для поиска сертификатов в нескольких источниках одновременно.

Флаги и режимы доступа

Функция поддерживает несколько режимов доступа:

  • Только чтение — флаг CERT_STORE_READONLY_FLAG предотвращает запись в хранилище.
  • Создание нового хранилища — если хранилище не существует, по умолчанию оно создаётся (кроме случая с флагом CERT_STORE_OPEN_EXISTING_FLAG).
  • Удаление хранилища — флаг CERT_STORE_DELETE_FLAG удаляет хранилище сразу после открытия (используется для очистки временных данных).
  • Отложенное закрытие — флаг CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAG позволяет удерживать хранилище открытым, пока существуют ссылки на сертификаты из него.

Применение

Проверка подлинности кода

В процессе проверки подписи файлов (например, Authenticode) система открывает хранилища сертификатов для поиска доверенных корневых центров и цепочек сертификации. CertOpenStore используется для доступа к хранилищам «CA» и «ROOT».

Работа с личными сертификатами

Приложения, использующие клиентские сертификаты (например, для аутентификации в веб-браузерах или VPN-клиентах), открывают хранилище «MY» для получения закрытых ключей и сертификатов.

Импорт и экспорт сертификатов

Функция позволяет открывать файлы сертификатов (.p7b, .pfx) для последующего импорта их содержимого в системные хранилища или для экспорта в другие форматы.

Криптографические операции

CertOpenStore используется в сочетании с другими функциями CryptoAPI (CertFindCertificateInStore, CertGetSubjectCertificateFromStore, CertCloseStore) для выполнения криптографических операций: шифрования, подписания, проверки подписей.

Пример использования (псевдокод)

``c HCERTSTORE hStore = CertOpenStore( sz_CERT_STORE_PROV_SYSTEM, PKCS_7_ASN_ENCODING | X509_ASN_ENCODING, 0, CERT_STORE_READONLY_FLAG, L"MY" ); if (hStore) { // Поиск сертификата PCCERT_CONTEXT pCert = CertFindCertificateInStore( hStore, PKCS_7_ASN_ENCODING | X509_ASN_ENCODING, 0, CERT_FIND_SUBJECT_STR, L"example.com", NULL ); if (pCert) { // Использование сертификата CertFreeCertificateContext(pCert); } CertCloseStore(hStore, 0); } ``

Ограничения и безопасность

  • Функция не проверяет подлинность хранилища, если не установлен флаг CERT_STORE_CHECK_TRUST. В версиях Windows до Vista этот флаг отсутствовал, что позволяло атакующим подменять системные хранилища через файловые или реестровые манипуляции.
  • При открытии файловых хранилищ из ненадёжных источников (например, из сети) необходимо проверять цифровую подпись файла перед загрузкой.
  • В Windows 10 и 11 добавлены дополнительные проверки целостности для системных хранилищ (защита через механизм Trusted Installer).

Сравнение с альтернативами

  • CertOpenSystemStore — устаревшая функция, не поддерживающая провайдеры и флаги. Рекомендуется заменять на CertOpenStore.
  • CertOpenStore с провайдером коллекций — более гибкий подход, чем открытие нескольких хранилищ по отдельности.
  • CNG (Cryptography Next Generation) — более современный API, но CertOpenStore остаётся актуальным для обратной совместимости.

Литература

  • Microsoft Docs. «CertOpenStore function (wincrypt.h)» — официальная документация.
  • MSDN Library. «Certificate Store Operations» — описание работы с хранилищами сертификатов.
  • Howard, M., LeBlanc, D. «Writing Secure Code» (2nd ed.) — главы о криптографических API Windows.
  • Microsoft Security Bulletins MS05-014, MS08-012 — описания уязвимостей, связанных с обработкой хранилищ сертификатов.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →