Поделиться через


Функция CertOpenStore (wincrypt.h)

Функция CertOpenStore открывает хранилище сертификатов с помощью указанного типа поставщика хранилища. Хотя эта функция может открыть хранилище сертификатов в большинстве случаев, рекомендуется открыть наиболее распространенные хранилища сертификатов CertOpenSystemStore. CertOpenStore требуется для более сложных вариантов и специальных случаев.

Синтаксис

HCERTSTORE CertOpenStore(
  [in] LPCSTR            lpszStoreProvider,
  [in] DWORD             dwEncodingType,
  [in] HCRYPTPROV_LEGACY hCryptProv,
  [in] DWORD             dwFlags,
  [in] const void        *pvPara
);

Параметры

[in] lpszStoreProvider

Указатель на строку ANSI, завершающую значение NULL, которая содержит тип поставщика хранилища.

Следующие значения представляют предопределенные типы хранилищ. Тип поставщика хранилища определяет содержимое параметра pvPara, а также использование и значение высокого слова параметра dwFlags. Дополнительные поставщики хранилища можно установить или зарегистрировать с помощью функции CryptInstallOIDFunctionAddress или функции CryptRegisterOIDFunction. Дополнительные сведения о добавлении поставщиков магазинов см. в расширении функциональных возможностей CertOpenStore.

Ценность Значение
CERT_STORE_PROV_COLLECTION
sz_CERT_STORE_PROV_COLLECTION
Открывает магазин, который будет коллекцией других магазинов. Хранилища добавляются в коллекцию или удаляются с помощью CertAddStoreToCollection и CertRemoveStoreFromCollection. При добавлении хранилища в коллекцию все сертификаты, списки запросов и списки сертификатов в этом хранилище становятся доступными для поиска или перечисления хранилища коллекций.

Высокое слово dwFlags равно нулю.

значение pvPara: Параметр pvPara должен быть NULL.

CERT_STORE_PROV_FILE
Инициализирует хранилище с сертификатами, списками отзыва сертификатов и списками сертификатов, считываемыми из указанного открытого файла. Этот поставщик ожидает, что файл будет содержать только сериализованное хранилище, а не подписанные сообщения PKCS #7 или один закодированный сертификат.

Указатель на файл должен быть расположен в начале сериализованного хранилища данных. После загрузки данных в сериализованное хранилище в хранилище сертификатов указатель файла размещается в начале любых данных, которые могут следовать сериализованным данным хранилища в файле. Если CERT_FILE_STORE_COMMIT_ENABLE задан в dwFlags, дескриптор файла дублируется, а хранилище всегда фиксируется как сериализованное хранилище. Файл не закрывается при закрытии хранилища.

значение pvPara: Параметр pvPara должен содержать указатель на дескриптор файла, открытый с помощью CreateFile.

CERT_STORE_PROV_FILENAME_A
Инициализирует хранилище с помощью сертификатов, списков отзыва сертификатов и списков сертификатов из файла. Поставщик открывает файл и сначала пытается прочитать файл в виде сериализованного хранилища, а затем в виде подписанного сообщения PKCS #7 и, наконец, в виде одного закодированного сертификата.

Параметр dwEncodingType должен содержать типы кодирования, используемые как с сообщениями, так и с сертификатами. Если файл содержит X.509 закодированный сертификат, открытая операция завершается ошибкой, а вызов функции GetLastError возвращает ERROR_ACCESS_DENIED. Если флаг CERT_FILE_STORE_COMMIT_ENABLE задан в dwFlags, значение dwCreationDisposition, переданное CreateFile, выглядит следующим образом:

  • Если установлен флаг CERT_STORE_CREATE_NEW_FLAG, CreateFile использует CREATE_NEW.
  • Если установлен флаг CERT_STORE_OPEN_EXISTING_FLAG, CreateFile использует OPEN_EXISTING.
  • Для всех остальных параметров dwFlagsCreateFile использует OPEN_ALWAYS.

Если dwFlags включает CERT_FILE_STORE_COMMIT_ENABLE, файл фиксируется как PKCS #7 или сериализованное хранилище в зависимости от типа файла, открытого. Если файл был пустым или если имя файла имеет расширение P7c или SPC, файл фиксируется как PKCS #7. В противном случае файл фиксируется как сериализованное хранилище.

значение pvPara: Параметр pvPara должен содержать указатель на строку ANSI, завершающую значение NULL, содержащую имя существующего нераскрытого файла.

CERT_STORE_PROV_FILENAME(_W)
sz_CERT_STORE_PROV_FILENAME(_W)
То же, что и CERT_STORE_PROV_FILENAME_A.

значение pvPara: Параметр pvPara должен содержать указатель на строку Юникода, завершающую значение NULL, которая содержит имя существующего нераскрытого файла.

CERT_STORE_PROV_LDAP(_W)
sz_CERT_STORE_PROV_LDAP(_W)
Инициализирует хранилище с сертификатами, crLs и CTLs из результатов запроса LDAP.

Для выполнения операций записи в хранилище строка запроса должна указывать базовый запрос без фильтра и одного атрибута.

значение pvPara: Если параметр dwFlags содержит CERT_LDAP_STORE_OPENED_FLAG, задайте pvPara адрес структуры CERT_LDAP_STORE_OPENED_PARA, указывающей используемый сеанс LDAP.

В противном случае задайте для pvPara указывать на строку Юникода, завершающую значение NULL, содержащую строку запроса LDAP. Дополнительные сведения о строках запросов LDAP см. в диалекте LDAP.

CERT_STORE_PROV_MEMORY
sz_CERT_STORE_PROV_MEMORY
Создает хранилище сертификатов в кэшированном памяти. Нет сертификатов, списки отзыва сертификатов (CRLs) или списки доверия сертификатов списки доверия сертификатов (CTLS) изначально загружаются в хранилище. Обычно используется для создания временного хранилища.

Любое добавление сертификатов, списков отзыва сертификатов или списков сертификатов или изменений в свойствах сертификатов, списков отзыва сертификатов или списков сертификатов в хранилище памяти не сохраняются автоматически. Их можно сохранить в файле или в память BLOB с помощью CertSaveStore.

значение pvPara: параметр pvPara не используется.

CERT_STORE_PROV_MSG
Инициализирует хранилище с помощью сертификатов, списков отзыва сертификатов и списков сертификатов из указанного криптографического сообщения. Параметр dwEncodingType должен содержать типы кодирования, используемые как с сообщениями, так и с сертификатами.

значение pvPara: Параметр pvPara содержит дескриптор HCRYPTMSG, возвращаемый вызовом CryptMsgOpenToDecode.

CERT_STORE_PROV_PHYSICAL(_W)
sz_CERT_STORE_PROV_PHYSICAL(_W)
Инициализирует хранилище с помощью сертификатов, списков отзыва сертификатов и списков сертификатов из указанного физического хранилища, являющегося членом логического системного хранилища.

Два имени разделены промежуточным обратным косой чертой (\), например Root.Default. Здесь "Root" — это имя системного хранилища и ". Значение по умолчанию — это имя физического хранилища. Имена системных и физических хранилищ не могут содержать обратные очки. Высокое слово dwFlags указывает расположение системного хранилища, обычно CERT_SYSTEM_STORE_CURRENT_USER. Дополнительные сведения см. в разделе dwFlags далее в этом разделе и см. в разделе расположения системного хранилища. Некоторые расположения физического хранилища можно открывать удаленно.

значение pvPara: параметр pvPara указывает на строку Юникода, завершающую значение NULL, которая содержит имя и физическое имя хранилища системы.

CERT_STORE_PROV_PKCS7
sz_CERT_STORE_PROV_PKCS7
Инициализирует хранилище с сертификатами, crLs и CTLs из подписанного сообщения PKCS #7. Параметр dwEncodingType должен указывать типы кодирования, которые будут использоваться как с сообщениями, так и с сертификатами.

значение pvPara: Параметр pvPara указывает на структуру CRYPT_DATA_BLOB, представляющую закодированное сообщение.

CERT_STORE_PROV_PKCS12
sz_CERT_STORE_PROV_PKCS12
Инициализирует хранилище с содержимым пакета PKCS #12.

Если пакет PKCS #12 защищен с помощью NULL или пустого пароля, эта функция завершится успешно при открытии хранилища.

Начиная с Windows 8 и Windows Server 2012, если пароль, внедренный в пакет PFX, был защищен субъектом Active Directory (AD) и текущим пользователем в качестве члена этого субъекта, имеет разрешение расшифровать пароль, эта функция будет успешно открывать хранилище. Дополнительные сведения см. в параметре pvPara и флаге PKCS12_PROTECT_TO_DOMAIN_SIDS функции PFXExportCertStoreEx.

Вы можете защитить пароли PFX для субъекта AD, начиная с Windows 8 и Windows Server 2012.

значение pvPara: Параметр pvPara указывает на структуру CRYPT_DATA_BLOB, представляющую пакет PKCS #12.

CERT_STORE_PROV_REG
Инициализирует хранилище с помощью сертификатов, списков отзыва сертификатов и списков сертификатов из подраздела реестра.

Этот поставщик открывает или создает вложенные разделы реестра сертификатов, списки отзыва сертификатови списки ctls в разделе, переданном в pvPara. Входной ключ не закрывается поставщиком. Перед возвратом поставщик открывает собственную копию ключа, переданного в pvPara. Если CERT_STORE_READONLY_FLAG задано в низком слове dwFlags, разделы реестра открываются с помощью RegOpenKey с KEY_READ_ACCESS. В противном случае подразделы реестра создаются с помощью RegCreateKey с KEY_ALL_ACCESS. Все изменения содержимого открытого хранилища немедленно сохраняются в реестре. Однако если CERT_STORE_READONLY_FLAG задано в низком слове dwFlags, любая попытка добавить в содержимое хранилища или изменить свойство контекста приводит к ошибке с GetLastError возвращая код E_ACCESSDENIED.

значение pvPara: Параметр pvPara содержит дескриптор открытого раздела реестра.

CERT_STORE_PROV_SERIALIZED
sz_CERT_STORE_PROV_SERIALIZED
Инициализирует хранилище с помощью сертификатов, списков отзыва сертификатов и списков сертификатов из расположения памяти, содержащего сериализованное хранилище.

значение pvPara: Параметр pvPara указывает на структуру CRYPT_DATA_BLOB, содержащую сериализованный большой двоичный объект памяти.

CERT_STORE_PROV_SMART_CARD(_W)
sz_CERT_STORE_PROV_SMART_CARD(_W)
В настоящее время не используется.
CERT_STORE_PROV_SYSTEM_A
Инициализирует хранилище с помощью сертификатов, списков отзыва сертификатов и списков сертификатов из указанного системного хранилища.

Системное хранилище — это логическое хранилище коллекций, состоящее из одного или нескольких физических хранилищ. Физическое хранилище, связанное с системным хранилищем, зарегистрировано в функции CertRegisterPhysicalStore. После открытия системного хранилища все физические хранилища, связанные с ним, также открываются вызовами CertOpenStore и добавляются в коллекцию системного хранилища с помощью функции CertAddStoreToCollection. Высокое слово dwFlags указывает расположение системного хранилища, обычно заданное для CERT_SYSTEM_STORE_CURRENT_USER. Дополнительные сведения о расположениях реестра см. в разделе dwFlags далее в этом разделе и расположения системного хранилища. Некоторые расположения системного хранилища можно открывать удаленно; Дополнительные сведения см. в разделе "Расположения system Store".

значении pvPara: параметр pvPara указывает на строку ANSI, завершающую значение NULL, содержащую имя хранилища системы, например "My" или "Root".

CERT_STORE_PROV_SYSTEM(_W)
sz_CERT_STORE_PROV_SYSTEM(_W)
То же, что и CERT_STORE_PROV_SYSTEM_A.

значение pvPara: Параметр pvPara указывает на строку Юникода, завершающую значение NULL, содержащую имя хранилища системы, например "My" или "Root".

CERT_STORE_PROV_SYSTEM_REGISTRY_A
Инициализирует хранилище с помощью сертификатов, списков отзыва сертификатов и списков сертификатов из физического хранилища реестра. Физическое хранилище не открывается как хранилище коллекций. Перечисления и поиски проходят только сертификаты, списки запросов и списки сертификатов в этом физическом хранилище.

Высокое слово dwFlags указывает расположение системного хранилища, обычно заданное для CERT_SYSTEM_STORE_CURRENT_USER. Дополнительные сведения см. в разделе dwFlags далее в этом разделе. Некоторые расположения системного хранилища могут быть открыты удаленно; Дополнительные сведения см. в разделе Расположения системного хранилища.

значении pvPara: параметр pvPara указывает на строку ANSI, завершающую значение NULL, содержащую имя хранилища системы, например "My" или "Root".

CERT_STORE_PROV_SYSTEM_REGISTRY(_W)
sz_CERT_STORE_PROV_SYSTEM_REGISTRY(_W)
То же, что и CERT_STORE_PROV_SYSTEM_REGISTRY_A.

значение pvPara: Параметр pvPara указывает на строку Юникода, завершающую значение NULL, содержащую имя хранилища системы, например "My" или "Root".

[in] dwEncodingType

Указывает тип кодирования сертификата и тип кодирования сообщений. Кодировка используется только в том случае, если параметр dwSaveAsфункции CertSaveStore содержит CERT_STORE_SAVE_AS_PKCS7. В противном случае параметр dwMsgAndCertEncodingType не используется.

Этот параметр применяется только в том случае, если тип поставщика CERT_STORE_PROV_MSG, CERT_STORE_PROV_PKCS7или CERT_STORE_PROV_FILENAME указан в параметре lpszStoreProvider. Для всех других типов поставщиков этот параметр не используется и должен иметь значение нулю.

Этот параметр может быть сочетанием одного или нескольких следующих значений.

Ценность Значение
PKCS_7_ASN_ENCODING
65536 (0x10000)
Указывает кодировку сообщений PKCS #7.
X509_ASN_ENCODING
1 (0x1)
Задает кодировку сертификата X.509.

[in] hCryptProv

Этот параметр не используется и должен иметь значение NULL.

Windows Server 2003 и Windows XP: дескриптор криптографического поставщика. Передача null для этого параметра приводит к использованию соответствующего поставщика по умолчанию. Рекомендуется использовать поставщик по умолчанию. По умолчанию или указанный поставщик шифрования используется для всех функций хранилища, которые проверяют подпись сертификата субъекта или списка отзыва сертификатов. Тип данных этого параметра HCRYPTPROV.

[in] dwFlags

Эти значения состоят из значений high-word и low-word, объединенных с помощью побитовойИЛИ операции.

Низкая часть dwFlags управляет различными общими характеристиками открытого хранилища сертификатов . Эту часть можно использовать со всеми типами поставщиков хранилища. Часть dwFlags с низким словом может быть одним из следующих значений.

Ценность Значение
CERT_STORE_BACKUP_RESTORE_FLAG
Используйте SE_BACKUP_NAME потока и SE_RESTORE_NAME привилегии для открытия реестра или файловых системных хранилищ. Если у потока нет этих привилегий, эта функция должна завершиться ошибкой отказа в доступе.
CERT_STORE_CREATE_NEW_FLAG
Новое хранилище создается, если он не существует. Функция завершается ошибкой, если хранилище уже существует.

Если ни CERT_STORE_OPEN_EXISTING_FLAG, ни CERT_STORE_CREATE_NEW_FLAG задано, хранилище открывается, если он существует или создается и открыт, если он еще не существует.

CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAG
Отложите закрытие поставщика хранилища до тех пор, пока не будут использоваться все сертификаты, списки отзыва сертификатов или списки сертификатов, полученные из хранилища. Хранилище фактически закрывается, когда последний сертификат, CRL или CTL, полученный из хранилища, освобождается. Все изменения, внесенные в свойства этих сертификатов, списков отзыва сертификатов и списков сертификатов, даже после вызова CertCloseStore.

Если этот флаг не задан, а сертификаты, списки отзыва сертификатов или списки ctls, полученные из хранилища, по-прежнему используются, любые изменения свойств этих сертификатов, списков отзыва сертификатов и списков сертификатов не будут сохранены.

Если эта функция вызывается с CERT_CLOSE_STORE_FORCE_FLAG, CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAG игнорируется.

Если этот флаг задан и значение параметраnullhCryptProv передается, этот поставщик будет продолжать использоваться даже после вызова этой функции.

CERT_STORE_DELETE_FLAG
Хранилище удаляется вместо открытия. Эта функция возвращает null для успешного и неудачного удаления. Чтобы определить успешное удаление, вызовите GetLastError, которая возвращает ноль, если хранилище было удалено и ненулевое значение, если оно не было удалено.
CERT_STORE_ENUM_ARCHIVED_FLAG
Как правило, перечисление всех сертификатов в хранилище будет игнорировать любой сертификат с набором свойств CERT_ARCHIVED_PROP_ID. Если этот флаг задан, перечисление сертификатов в хранилище будет содержать все сертификаты в хранилище, включая те, которые имеют свойство CERT_ARCHIVED_PROP_ID.
CERT_STORE_MAXIMUM_ALLOWED_FLAG
Откройте хранилище с максимальным набором разрешенных разрешений. Если этот флаг указан, хранилища реестра сначала открываются с доступом на запись и при сбое, они повторно открываются с доступом только для чтения.
CERT_STORE_NO_CRYPT_RELEASE_FLAG
Этот флаг не используется, если параметр hCryptProvNULL. Этот флаг действителен, только если дескриптор CSP, отличный отNULL, передается в качестве параметра hCryptProv. При закрытии хранилища сертификатов этот флаг предотвращает автоматическое освобождение неотделяемого CSP.
CERT_STORE_OPEN_EXISTING_FLAG
Откройте только существующее хранилище. Если хранилище не существует, функция завершается ошибкой.
CERT_STORE_READONLY_FLAG
Откройте хранилище в режиме только для чтения. Любая попытка изменить содержимое хранилища приведет к ошибке. Если этот флаг установлен и используется поставщик хранилища на основе реестра, вложенные разделы реестра открываются с помощью RegOpenKey с KEY_READ_ACCESS. В противном случае вложенные разделы реестра создаются с помощью RegCreateKey с KEY_ALL_ACCESS.
CERT_STORE_SET_LOCALIZED_NAME_FLAG
Если этот флаг поддерживается, поставщик задает свойство CERT_STORE_LOCALIZED_NAME_PROP_ID магазина. Локализованное имя можно получить, вызвав функцию CertGetStoreProperty с dwPropID значение CERT_STORE_LOCALIZED_NAME_PROP_ID. Этот флаг поддерживается для поставщиков типов CERT_STORE_PROV_FILENAME, CERT_STORE_PROV_SYSTEM, CERT_STORE_PROV_SYSTEM_REGISTRYи CERT_STORE_PROV_PHYSICAL_W.
CERT_STORE_SHARE_CONTEXT_FLAG
При открытии хранилища можно задать этот флаг, чтобы обеспечить эффективное использование памяти, повторно используя память для закодированных частей сертификата, CRL или CTL в открытых экземплярах хранилищ.
CERT_STORE_UPDATE_KEYID_FLAG
Списки идентификаторов ключей существуют в CurrentUser и LocalMachine. Эти идентификаторы ключей имеют свойства, такие как свойства сертификатов. Если задана CERT_STORE_UPDATE_KEYID_FLAG, то для каждого идентификатора ключа в расположении хранилища, имеющего свойство CERT_KEY_PROV_INFO_PROP_ID, это свойство автоматически обновляется из свойства идентификатора ключа CERT_KEY_PROV_INFO_PROP_ID или CERT_KEY_IDENTIFIER_PROP_ID сертификата, связанного с этим идентификатором ключа.
 

Типы поставщиков CERT_STORE_PROV_SYSTEM, CERT_STORE_PROV_SYSTEM_REGISTRYи CERT_STORE_PROV_PHYSICAL используют следующие высокие слова dwFlags, чтобы указать расположения реестра системного хранилища:

CERT_SYSTEM_STORE_CURRENT_SERVICE

CERT_SYSTEM_STORE_CURRENT_USER

CERT_SYSTEM_STORE_CURRENT_USER_GROUP_POLICY

CERT_SYSTEM_STORE_LOCAL_MACHINE

CERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRISE

CERT_SYSTEM_STORE_LOCAL_MACHINE_GROUP_POLICY

CERT_SYSTEM_STORE_SERVICES

CERT_SYSTEM_STORE_USERS

По умолчанию расположение системного хранилища открывается относительно HKEY_CURRENT_USER, HKEY_LOCAL_MACHINEили HKEY_USERS предопределенного раздела реестра. Дополнительные сведения см. в разделе Расположения системного хранилища.

Следующие флаги с высоким уровнем слов переопределяют это поведение по умолчанию.

Ценность Значение
CERT_SYSTEM_STORE_RELOCATE_FLAG
При установке pvPara должен содержать указатель на структуру CERT_SYSTEM_STORE_RELOCATE_PARA, а не строку. Структура указывает имя хранилища и его расположение в реестре.
CERT_SYSTEM_STORE_UNPROTECTED_FLAG
По умолчанию при открытии хранилища CurrentUser "Root" все корни SystemRegistry, не находящиеся в защищенном корневом списке, удаляются из кэша до возврата этой функции. Если этот флаг задан, этот по умолчанию переопределяется, и возвращаются все корни в SystemRegistry, и проверка защищенного корневого списка не выполняется.
 

Поставщик CERT_STORE_PROV_REGISTRY использует следующие флаги высокого уровня.

Ценность Значение
CERT_REGISTRY_STORE_REMOTE_FLAG
pvPara содержит дескриптор раздела реестра на удаленном компьютере. Чтобы получить доступ к разделу реестра на удаленном компьютере, необходимо задать разрешения безопасности на удаленном компьютере, чтобы разрешить доступ. Дополнительные сведения см. в разделе "Примечания".
CERT_REGISTRY_STORE_SERIALIZED_FLAG
Поставщик CERT_STORE_PROV_REG сохраняет сертификаты, списки отзыва сертификатов и списки ctls в одном сериализованном подразделе хранилища вместо выполнения операции сохранения по умолчанию. По умолчанию каждый сертификат, список отзыва сертификатов или CTL сохраняется в виде отдельного подраздела реестра в соответствующем подразделе.

Этот флаг в основном используется для магазинов, скачанных из шаблона групповой политики (GPT), таких как хранилища CurrentUserGroupPolicy и LocalMachineGroupPolicy.

Если CERT_REGISTRY_STORE_SERIALIZED_FLAG задано, сохраняются дополнения, удаления или изменения свойств, пока не будет выполнен вызов CertCloseStore или CertControlStore с помощью CERT_STORE_CTRL_COMMIT.

 

Типы поставщиков CERT_STORE_PROV_FILE и CERT_STORE_PROV_FILENAME используют следующие флаги высокого слова.

Ценность Значение
CERT_FILE_STORE_COMMIT_ENABLE
Установка этого флага фиксирует любые дополнения к хранилищу или любые изменения, внесенные в свойства контекстов в хранилище файлов либо при вызове CertCloseStore, либо при вызове CertControlStore с CERT_STORE_CONTROL_COMMIT.

CertOpenStore завершается ошибкой E_INVALIDARG, если CERT_FILE_STORE_COMMIT_ENABLE и CERT_STORE_READONLY_FLAG заданы в dwFlags.

 

Тип поставщика CERT_STORE_PROV_LDAP использует следующие флаги высокого слова.

Ценность Значение
CERT_LDAP_STORE_AREC_EXCLUSIVE_FLAG
Выполняет поиск DNS только для записи по URL-адресу с именем в параметре pvPara. Это предотвращает создание ложных запросов DNS при разрешении имен узлов URL-адресов. Используйте этот флаг при передаче имени узла в отличие от имени домена для параметра pvPara.
CERT_LDAP_STORE_OPENED_FLAG
Используйте этот флаг для использования существующего сеанса LDAP. При указании этого флага параметр pvPara является адресом структуры CERT_LDAP_STORE_OPENED_PARA, содержащей сведения об используемом сеансе LDAP.
CERT_LDAP_STORE_SIGN_FLAG
Чтобы обеспечить целостность, необходимую для некоторых приложений, цифрово подписать весь трафик LDAP на сервер LDAP и с сервера LDAP с помощью протокола проверки подлинности Kerberos.
CERT_LDAP_STORE_UNBIND_FLAG
Используйте этот флаг с флагом CERT_LDAP_STORE_OPENED_FLAG, чтобы сеанс LDAP был отключен при закрытии хранилища. Система отменит привязку сеанса LDAP с помощью функции ldap_unbind при закрытии хранилища.

[in] pvPara

32-разрядное значение, которое может содержать дополнительные сведения для этой функции. Содержимое этого параметра зависит от значения lpszStoreProvider и других параметров.

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

Если функция выполнена успешно, функция возвращает дескриптор в хранилище сертификатов . По завершении использования хранилища отпустите дескриптор, вызвав функцию CertCloseStore.

Если функция завершается ошибкой, она возвращает NULL. Для получения расширенных сведений об ошибке вызовите GetLastError.

ПримечаниеCreateFile, ReadFileили ошибки реестра могут распространяться и их коды ошибок возвращаются. CertOpenStore имеет собственный код ошибки, код ERROR_FILE_NOT_FOUND, указывающий, что функция не смогла найти поставщика, указанного параметром lpszStoreProvider.
 

Замечания

Системное хранилище — это коллекция, состоящая из одного или нескольких физических одноуровневых хранилищ. Для каждого системного хранилища существуют предопределенные физические одноуровневые хранилища. После открытия системного хранилища, например "My" в CERT_SYSTEM_STORE_CURRENT_USER, вызывается вызов CertOpenStore для открытия всех физических хранилищ в коллекции системного хранилища. Каждый из этих физических хранилищ добавляется в коллекцию системного хранилища с помощью функции CertAddStoreToCollection. Все сертификаты, crls и списки ctls в этих физических хранилищах доступны через коллекцию логических системных хранилищ.

Примечание Порядок контекста сертификата может не сохраняться в хранилище. Чтобы получить доступ к конкретному сертификату, необходимо выполнить итерацию по сертификатам в хранилище.
 

Следующие расположения системного хранилища можно открывать удаленно:

  • CERT_SYSTEM_STORE_LOCAL_MACHINE
  • CERT_SYSTEM_STORE_LOCAL_MACHINE_GROUP_POLICY
  • CERT_SYSTEM_STORE_SERVICES
  • CERT_SYSTEM_STORE_USERS

Расположения хранилища системы открываются удаленно путем префикса имени хранилища в строке, переданной в pvPara с именем компьютера. Примерами имен удаленного хранилища систем являются:

  • ComputerName\ЦС
  • \\ComputerName\ЦС
  • ComputerName\ServiceName\Trust
  • \\ComputerName\ServiceName\Trust

Дополнительные сведения о системных хранилищах см. в расположениях системного хранилища.

Дополнительные сведения о хранилищах, которые автоматически переносятся, см. в миграции хранилища сертификатов.

Примеры

В следующем примере показано открытие нескольких хранилищ сертификатов разных типов поставщиков хранилища. В примере используется функция CreateMyDACL, определенная в разделе Создание DACL, чтобы убедиться, что открытый файл создается с соответствующим daCL. Дополнительные примеры открытия других типов поставщиков хранилища см. в примере кода C для открытия хранилищ сертификатов.

//-------------------------------------------------------------------
// Open a system store, in this case, the My store.

HCERTSTORE hSysStore = NULL;
if(hSysStore = CertOpenStore(
   CERT_STORE_PROV_SYSTEM,          // The store provider type
   0,                               // The encoding type is
                                    // not needed
   NULL,                            // Use the default HCRYPTPROV
   CERT_SYSTEM_STORE_CURRENT_USER,  // Set the store location in a
                                    // registry location
   L"MY"                            // The store name as a Unicode 
                                    // string
   ))
{
    printf("The system store was created successfully.\n");
}
else
{
    printf("An error occurred during creation "
        "of the system store!\n");
    exit(1);
}

// Other common system stores include "Root", "Trust", and "Ca".


//-------------------------------------------------------------------
// Open a memory store. 

HCERTSTORE hMemStore = NULL;
if(hMemStore = CertOpenStore(
   CERT_STORE_PROV_MEMORY,   // The memory provider type
   0,                        // The encoding type is not needed
   NULL,                     // Use the default HCRYPTPROV
   0,                        // Accept the default dwFlags
   NULL                      // pvPara is not used
   ))
{
    printf("The memory store was created successfully.\n");
}
else
{
    printf("An error occurred during creation "
        "of the memory store!\n");
    exit(1);
}

//-------------------------------------------------------------------
// Open a read-only store from disk.

HANDLE       hFile = NULL;
HCERTSTORE   hFileStore = NULL;
LPCSTR       pszFileName = "TestStor2.sto";
SECURITY_ATTRIBUTES  sa;        // For DACL

// Create a DACL to use when opening the file.
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = FALSE;  

// Call function to set the DACL. The DACL is set in the 
// SECURITY_ATTRIBUTES lpSecurityDescriptor member.
if (!CreateMyDACL(&sa))
{
     // Error encountered; generate message and exit.
     printf("Failed CreateMyDACL.\n");
        exit(1);
}

// Obtain the file handle of an existing file.
if (hFile = CreateFile(
     pszFileName,                  // The file name
     GENERIC_READ|GENERIC_WRITE,   // Access mode: Read from and
                                   // write to this file
     0,                            // Share mode
     &sa,                          // Uses the DACL created 
                                   // previously 
     OPEN_ALWAYS,                  // How to create
     FILE_ATTRIBUTE_NORMAL,        // File attributes
     NULL))                        // Template
{
    printf("The file was opened successfully.\n");
}
else
{
    printf("An error occurred during opening of the file!\n");
    exit(1);
}

//-------------------------------------------------------------------
//  This file can contain data before the store itself.
//  At this point, read and use data in the open file that precedes
//  the serialized certificate store data. 
//  To open the certificate store, the file pointer must
//  be placed at the beginning of the certificate store data.

//-------------------------------------------------------------------
//  Open the store.

if(hFileStore = CertOpenStore(
    CERT_STORE_PROV_FILE,     // Load certificates from a file
    0,                        // Encoding type not used
    NULL,                     // Use the default HCRYPTPROV
    CERT_STORE_READONLY_FLAG, // Read-only store
    hFile                     // The handle for the open file 
                              // that is the source of the 
                              // certificates
    ))
{
    printf("The file store was created successfully.\n");
}
else
{
    printf("An error occurred during creation of the file store!\n");
    exit(1);
}

//-------------------------------------------------------------------
// After processing, close the certificate stores and the file.

if(CertCloseStore(
        hSysStore, 
        CERT_CLOSE_STORE_CHECK_FLAG))
{
    printf("The system store was closed successfully.\n");
}
else
{
    printf("An error occurred during closing of the "
        "system store.\n");
}

if(CertCloseStore(
        hMemStore, 
        CERT_CLOSE_STORE_CHECK_FLAG))
{
    printf("The memory store was closed successfully.\n");
}
else
{
    printf("An error occurred during closing of the "
        "memory store.\n");
}

if(CertCloseStore(
        hFileStore, 
        CERT_CLOSE_STORE_CHECK_FLAG))
{
    printf("The file store was closed successfully.\n");
}
else
{
    printf("An error occurred during closing of the file store.\n");
}

if(CloseHandle(hFile))
{
    printf("The file was closed successfully.\n");
}
else
{
    printf("An error occurred during closing of the file.\n");
}

Требования

Требование Ценность
минимальные поддерживаемые клиентские Windows XP [классические приложения | Приложения UWP]
минимальный поддерживаемый сервер Windows Server 2003 [классические приложения | Приложения UWP]
целевая платформа Виндоус
заголовка wincrypt.h
библиотеки Crypt32.lib
DLL Crypt32.dll

См. также

CERT_SYSTEM_STORE_RELOCATE_PARA

CertCloseStore

CertSaveStore

функции хранилища сертификатов