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 →