Функция 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, завершающуюся нулевым значением, которая содержит тип поставщика хранилища.

Следующие значения представляют предопределенные типы хранилищ. Тип поставщика хранилища определяет содержимое параметра pvPara , а также использование и значение слова high параметра 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)
Инициализирует хранилище с помощью сертификатов, списков отзыва сертификатов и списков сертификатов на основе результатов запроса 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
Создает хранилище сертификатов в кэше памяти. Сертификаты, списки отзыва сертификатов (CRL) или списки доверия сертификатов (CCL) изначально не загружаются в хранилище. Обычно используется для создания временного хранилища.

Любое добавление сертификатов, списков отзыва сертификатов или списков CCL, а также изменения в свойствах сертификатов, списков отзыва сертификатов или списков CCL в хранилище памяти не сохраняются автоматически. Их можно сохранить в файл или большой двоичный объект памяти с помощью 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" — это имя системного хранилища и ". Default" — имя физического хранилища. Имена систем и физических хранилищ не могут содержать обратные косые черти. Высокое слово dwFlags указывает расположение системного хранилища, обычно CERT_SYSTEM_STORE_CURRENT_USER. Дополнительные сведения см. в разделе dwFlags далее в этом разделе и в разделе Расположения системного хранилища. Некоторые физические расположения хранилищ можно открыть удаленно.

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

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

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

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

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

Начиная с 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
Инициализирует хранилище с помощью сертификатов, списков отзыва сертификатов и списков сертификатов из подраздела реестра.

Этот поставщик открывает или создает подразделы реестра Certificates, CRL и 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 структуру, содержащую сериализованный 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 далее в этом разделе и Расположения системного хранилища. Некоторые расположения системных хранилищ можно открыть удаленно; Дополнительные сведения см. в разделе Расположения системного хранилища.

значение 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
Инициализирует хранилище с помощью сертификатов, списков отзыва сертификатов и списков сертификатов из физического хранилища реестра. Физическое хранилище не открывается как хранилище коллекций. Перечисления и поиск проходят только сертификаты, списки отзыва сертификатов и списки CCL в одном физическом хранилище.

Высокое слово 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

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

Часть 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
Отложите закрытие поставщика хранилища до тех пор, пока не будут использоваться все сертификаты, списки отзыва сертификатов или списки сертификатов, полученные из хранилища. Хранилище фактически закрывается при освобождении последнего сертификата, списка отзыва сертификатов или CTL, полученных из хранилища. Все изменения, внесенные в свойства этих сертификатов, списков отзыва сертификатов и списков сертификатов, даже после вызова CertCloseStore, сохраняются.

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

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

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

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
Этот флаг не используется, если параметр hCryptProv имеет значение NULL. Этот флаг действителен, только если в качестве параметра hCryptProv передается дескриптор CSP, отличный от NULL. Установка этого флага предотвращает автоматическое освобождение нестандартного 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
При многократном открытии хранилища можно установить этот флаг, чтобы обеспечить эффективное использование памяти путем повторного использования памяти для закодированных частей сертификата, списка отзыва сертификатов или контекста 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 все корневые элементы SystemRegistry, не храняся в защищенном корневом списке, удаляются из кэша до возврата этой функции. Если этот флаг установлен, значение по умолчанию переопределяется, возвращаются все корневые данные в SystemRegistry, а проверка защищенного корневого списка не выполняется.
 

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

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

Этот флаг в основном используется для хранилищ, скачанных из шаблона групповой политики (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 только для записи A по 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 . Все сертификаты, списки отзыва сертификатов и списки сертификатов в этих физических хранилищах доступны через коллекцию логических системных хранилищ.

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

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

  • CERT_SYSTEM_STORE_LOCAL_MACHINE
  • CERT_SYSTEM_STORE_LOCAL_MACHINE_GROUP_POLICY
  • CERT_SYSTEM_STORE_SERVICES
  • CERT_SYSTEM_STORE_USERS

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

  • Имя_компьютера\ЦС
  • \\Имя_компьютера\ЦС
  • Имя_компьютера\Имя_службы\Доверие
  • \\Имя_компьютера\Имя_службы\Доверие

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

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

Примеры

В следующем примере показано открытие нескольких хранилищ сертификатов разных типов поставщиков хранилищ. В этом примере используется функция 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]
Целевая платформа Windows
Header wincrypt.h
Библиотека Crypt32.lib
DLL Crypt32.dll

См. также раздел

CERT_SYSTEM_STORE_RELOCATE_PARA

CertCloseStore

CertSaveStore

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