Управление состоянием хранилища сертификатов
Несколько функций предоставляют службы для управления состоянием хранилища сертификатов.
Чтобы получить доступ к сертификатам, хранилище сертификатов, в котором они хранятся, необходимо открыть через вызов CertOpenStore или CertOpenSystemStore.
Обычно хранилище сертификатов открывается в кэшированном памяти. Это может быть новое хранилище или его содержимое можно загрузить из локального реестра, реестра на удаленном компьютере, файла диска, сообщения PKCS #7 или другого источника.
Функции хранилища сертификатов CryptoAPI также позволяют хранилищу хранить сертификаты вне кэшированного объема памяти, например внешнюю базу данных сертификатов, например базу данных, предоставляемую базой данных сервера сертификатов Майкрософт.
Один из параметров функции CertOpenStore lpszStoreProvider определяет тип открытого хранилища и поставщика, используемого для открытия этого хранилища. Примеры открытия хранилищ сертификатов с помощью различных поставщиков см . в примере кода C для открытия хранилищ сертификатов.
CertCloseStore закрывает хранилище сертификатов. При закрытии хранилища сертификатов каждый из контекстов сертификата в этом хранилище содержит его количество ссылок, сокращенное на один. Память освобождается для сертификатов, количество ссылок которых переходит к нулю.
Установка CERT_CLOSE_STORE_FORCE_FLAG с помощью CertCloseStore закрывает хранилище сертификатов и освобождает память для всех контекстов сертификатов независимо от их количества ссылок. В некоторых случаях, например в многопоточных программах, это не может быть желательным. Если задано CERT_CLOSE_STORE_CHECK_FLAG, хранилище закрывается, но предупреждение возвращается функцией, если память по-прежнему выделена для сертификатов, количество ссылок которых не было сокращено до нуля. Если число ссылок сертификата больше нуля, дубликат этого контекста сертификата не был освобожден. Используйте CertFreeCertificateContext, CertFreeCRLContext и CertFreeCTLContext, чтобы освободить все сертификаты, оставшиеся открытыми.
Примечание.
Контекст сертификата — это структура типа CERT_CONTEXT, которая, среди прочего, указывает на кодированный BLOB-объект сертификата и указатель на структуру CERT_INFO. Структура CERT_INFO содержит наиболее важные данные сертификата. Дополнительные сведения о сертификатах, списке отзыва сертификатов (CRL) и структурах контекста списка доверия сертификатов см. в разделе "Кодировка и декодирование контекста сертификата".
Каждый контекст сертификата также содержит число ссылок, указывающее количество копий адреса контекста, назначенных. Каждый раз, когда контекст сертификата дублируется каким-либо образом, его число ссылок увеличивается по одному. Каждый раз, когда указатель на контекст сертификата освобождается, количество ссылок в контексте сертификата уменьшается по одному. Если количество ссылок в контексте сертификата достигает нуля, память, содержащая контекст, выделяется. Память, выделенная для контекста сертификата, также выделяется, если этот контекст находится в хранилище, а хранилище закрывается с помощью CERT_CLOSE_STORE_FORCE_FLAG. Если память для контекста выделена, а указатели на этот контекст по-прежнему используются, эти указатели больше не допустимы.
CertDuplicateStore увеличивает количество ссылок в магазине.
CertSaveStore сохраняет содержимое хранилища в файл диска или расположение памяти, а также
CertControlStore управляет хранилищем во время открытия. Приложение с открытым хранилищем может быть уведомлено, когда сохраняемое состояние этого хранилища изменилось с помощью какого-то другого процесса. Это может произойти, если новые сертификаты были скопированы в локальное хранилище компьютеров с компьютера управления доменом.
При обнаружении изменений кэшированное хранилище может повторно синхронизировать кэшированное хранилище в соответствии с сохраненным состоянием хранилища. CertControlStore также поддерживает процесс, который копирует кэшированные изменения хранилища в постоянное хранилище, когда эти изменения в кэшированном хранилище не сохраняются автоматически.
Контексты сертификатов, подобные хранилищу сертификатов, могут иметь расширенные свойства. CertSetStoreProperty добавляет расширенные свойства в хранилище сертификатов. CertGetStoreProperty извлекает все свойства, заданные в хранилище сертификатов. В настоящее время единственным предопределенным свойством хранилища сертификатов является локализованное имя хранилища.