Функция PFXImportCertStore (wincrypt.h)
Функция PFXImportCertStore импортирует BLOB-объект PFX и возвращает дескриптор хранилища, содержащего сертификаты и все связанные закрытые ключи.
Синтаксис
HCERTSTORE PFXImportCertStore(
[in] CRYPT_DATA_BLOB *pPFX,
[in] LPCWSTR szPassword,
[in] DWORD dwFlags
);
Параметры
[in] pPFX
Указатель на структуру CRYPT_DATA_BLOB, содержащую пакет PFX с экспортируемыми и зашифрованными сертификатами и ключами.
[in] szPassword
Строковый пароль, используемый для расшифровки и проверки пакета PFX. Если задано значение строки длиной больше нуля или задано пустой строкой или значением NULL, это значение должно быть точно таким же, как и значение, используемое для шифрования пакета.
Начиная с Windows 8 и Windows Server 2012, если пакет PFX был создан в функции PFXExportCertStoreEx с помощью флага PKCS12_PROTECT_TO_DOMAIN_SIDS, функция PFXImportCertStore пытается расшифровать пароль с помощью субъекта Active Directory (AD), который использовался для шифрования. Субъект AD указан в параметре pvPara. Если параметр szPassword в функции PFXExportCertStoreEx был пустой строкой или NULL, а параметру dwFlags dwFlags задано значение PKCS12_PROTECT_TO_DOMAIN_SIDS, то эта функция случайно создала пароль и зашифровала его субъекту AD, указанному в параметре pvPara. В этом случае следует задать пароль для значения, пустой строки или NULL, который использовался при создании пакета PFX. Функция PFXImportCertStore будет использовать субъект AD для расшифровки случайного пароля, а для расшифровки PFX-сертификата будет использоваться случайный пароль.
После завершения использования пароля снимите его из памяти, вызвав функцию SecureZeroMemory. Дополнительные сведения о защите паролей см. в обработке паролей.
[in] dwFlags
Параметр dwFlags
Ценность | Значение |
---|---|
|
Импортированные ключи помечены как экспортируемые. Если этот флаг не используется, вызовы функции CryptExportKey с ошибкой дескриптора ключа. |
|
Пользователь должен получать уведомления с помощью диалогового окна или другого метода при определенных попытках использовать этот ключ. Точное поведение определяется используемым поставщиком служб шифрования (CSP).
До Internet Explorer 4.0 поставщики служб шифрования Майкрософт проигнорировали этот флаг. Начиная с Internet Explorer 4.0 поставщики майкрософт поддерживают этот флаг. Если контекст поставщика был открыт с набором флагов CRYPT_SILENT, использование этого флага приводит к сбою, а последняя ошибка имеет значение NTE_SILENT_CONTEXT. |
|
Закрытые ключи хранятся на локальном компьютере, а не под текущим пользователем. |
|
Закрытые ключи хранятся под текущим пользователем, а не под локальным компьютером, даже если PFX BLOB указывает, что они должны перейти на локальный компьютер. |
|
Указывает, что поставщик хранилища ключей CNG предпочтителен (KSP). Если CSP указан в PFX-файле, используется CSP, в противном случае предпочтителен KSP. Если поставщик ключевых показателей эффективности CNG недоступен, функция PFXImportCertStore завершится ошибкой.
Windows Server 2003 и Windows XP: это значение не поддерживается. |
|
Указывает, что CNG KSP всегда используется. При указании PFXImportCertStore пытается использовать CNG KSP независимо от сведений о поставщике в PFX-файле. Если CNG KSP недоступен, импорт не завершится ошибкой.
Windows Server 2003 и Windows XP: это значение не поддерживается. |
|
Разрешить перезапись существующего ключа. Укажите этот флаг при возникновении сценария, в котором необходимо импортировать PFX-файл, содержащий имя ключа, которое уже существует. Например, при импорте PFX-файла возможно, что контейнер с тем же именем уже присутствует, так как для контейнеров ключей нет уникального пространства имен. Если вы создали "TestKey" на компьютере, а затем импортируете PFX-файл, который также имеет "TestKey" в качестве контейнера ключей, параметр PKCS12_ALLOW_OVERWRITE_KEY позволяет перезаписывать ключ.
Windows Server 2003 и Windows XP: это значение не поддерживается. |
|
Не сохраняйте ключ. Укажите этот флаг, если не хотите сохранять ключ. Например, если не требуется хранить ключ после проверки, вместо создания контейнера и его удаления можно указать этот флаг, чтобы немедленно удалить ключ.
Примечание Если флаг PKCS12_NO_PERSIST_KEY имеет значение *not*, ключи сохраняются на диске. Если вы не хотите сохранять ключи за пределами их использования, их необходимо удалить, вызвав функцию
Примечание Некоторые другие вопросы:
|
|
Импортируйте все расширенные свойства сертификата, сохраненные в сертификате при экспорте.
Windows Server 2003 и Windows XP: это значение не поддерживается. |
|
Распаковка, но не сохраняйте результаты. |
Возвращаемое значение
Если функция выполнена успешно, функция возвращает дескриптор в хранилище сертификатов, содержащее импортированные сертификаты, включая доступные закрытые ключи.
Если функция завершается ошибкой, то есть если параметр пароля не содержит точного совпадения с паролем, используемым для шифрования экспортированного пакета или при возникновении других проблем с декодированием BLOB-объекта PFX, функция возвращает NULL, а код ошибки можно найти, вызвав функцию GetLastError.
Замечания
Функция PFXImportCertStore открывает временное хранилище. Если функция выполнена успешно, следует закрыть дескриптор в хранилище, вызвав функцию CertCloseStore.
При импорте сертификата из пакета PFX Имя контейнера CSP/KSP определяется с помощью АтрибутИда с OID 1.3.6.1.4.1.1.311.17.1 PKCS8ShroudedKeyBag SafeBag [bagId: 1.2.840.113549.1.12.10.1.2] (см. PKCS #12 подробные сведения о структуре ASN.1 этого).
- AttributeId: 1.3.6.1.4.1.311.17.1
- значение : имя KSP или имя CSP
Если Атрибутивная идентификатора отсутствует и флаг PREFER_CNG передается, MS_KEY_STORAGE_PROVIDER выбирается. Если Атрибутивная идентификатора отсутствует и флаг PREFER_CNG не передается, имя поставщика определяется на основе алгоритма открытого ключа (то есть алгоритм открытого ключа определяется алгоритмом AlgorithmIdentifier в PKCS #8):
- RSA: MS_ENHANCED_PROV_W
- DSA: MS_DEF_DSS_DH_PROV_W
Аналогичным образом спецификация ключа определяется с помощью атрибута OID 2.5.29.15 (szOID_KEY_USAGE) следующим образом:
Если используется ключ CAPI:
- Если задан KEY_ENCIPHERMENT или DATA_ENCIPHERMENT, то для спецификации ключа задано значение AT_KEYEXCHANGE.
- Если задан DIGITAL_SIGNATURE или CERT_SIGN или CRL_SIGN, то для спецификации ключа задано значение AT_SIGNATURE.
Если используется ключ CNG:
- Если задан KEY_ENCIPHERMENT или DATA_ENCIPHERMENT или ENCIPHER_ONLY или DECIPHER_ONLY, то для ALLOW_DECRYPT используется ключ ncrypt.
- Если задан DIGITAL_SIGNATURE или CERT_SIGN или CRL_SIGN, то для ALLOW_SIGN задано использование ключа ncrypt.
- Если задан KEY_AGREEMENT, то для ALLOW_KEY_AGREEMENT используется ключ ncrypt.
Если Атрибутивная идентификатора отсутствует, то значение ключа CAPI имеет значение AT_KEYEXCHANGE для RSA или DH, а алгоритм определяется алгоритмом в PKCS #8; В противном случае алгоритму присвоено значение AT_SIGNATURE. Для значения ключа CNG устанавливается все использование ключей ncrypt.
Заметка
Если недопустимое имя поставщика присутствует в пакете PFX, или базовый или расширенный поставщик криптографии отсутствует в этом разделе реестра: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider, то поиск поставщика выполняется типом поставщика с помощью этого подраздела реестра: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider Types.
Корпорация Майкрософт поддерживает только два алгоритма шифрования и хэша для импорта PFX:
- TripleDES-SHA1
- AES256-SHA256
Для любого из указанных выше алгоритмов шифрование сертификатов является необязательным.
Корпорация Майкрософт может экспортировать PFX из хранилища сертификатов с помощью выбора All Tasks
>Yes, export the private key
. Там можно выбрать алгоритм шифрования и хэша, чтобы соответствовать одному из этих двух вариантов.
С помощью PowerShell можно экспортировать PFX с помощью следующей команды:
Export-PfxCertificate
[-CryptoAlgorithmOption <CryptoAlgorithmOptions>]
-CryptoAlgorithmOption
задает алгоритм шифрования закрытых ключей в PFX-файле. Если этот параметр не указан, значение по умолчанию TripleDES_SHA1
. Допустимые значения для этого параметра:
Ценность | Описание |
---|---|
TripleDES_SHA1 |
Закрытые ключи будут зашифрованы в PFX-файле с помощью тройного шифрования DES. |
AES256_SHA256 |
Закрытые ключи будут зашифрованы в PFX-файле с помощью шифрования AES-256. |
OpenSSL поддерживает приведенные выше два алгоритма с помощью следующих команд:
openssl pkcs12 -keypbe PBE-SHA1-3DES -certpbe PBE-SHA1-3DES -in in.pem -export -out out.pfx -password file:password.txt -passin file:password.txt
openssl pkcs12 -keypbe AES-256-CBC -certpbe AES-256-CBC -macalg sha256 -in in.pem -export -out out.pfx -password file:password.txt -passin file:password.txt
Следующие команды эквивалентны предыдущим двум, но они не шифруют сертификаты:
openssl pkcs12 -keypbe PBE-SHA1-3DES -certpbe NONE -in in.pem -export -out out.pfx -password file:password.txt -passin file:password.txt
openssl pkcs12 -keypbe AES-256-CBC -certpbe NONE -macalg sha256 -in in.pem -export -out out.pfx -password file:password.txt -passin file:password.txt
Требования
Требование | Ценность |
---|---|
минимальные поддерживаемые клиентские | Windows XP [классические приложения | Приложения UWP] |
минимальный поддерживаемый сервер | Windows Server 2003 [классические приложения | Приложения UWP] |
целевая платформа | Виндоус |
заголовка | wincrypt.h |
библиотеки |
Crypt32.lib |
DLL | Crypt32.dll |