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


Функция 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 может быть одним из следующих значений:

Ценность Значение
CRYPT_EXPORTABLE
0x00000001
Импортированные ключи помечены как экспортируемые. Если этот флаг не используется, вызовы функции CryptExportKey с ошибкой дескриптора ключа.
CRYPT_USER_PROTECTED
0x00000002
Пользователь должен получать уведомления с помощью диалогового окна или другого метода при определенных попытках использовать этот ключ. Точное поведение определяется используемым поставщиком служб шифрования (CSP).

До Internet Explorer 4.0 поставщики служб шифрования Майкрософт проигнорировали этот флаг. Начиная с Internet Explorer 4.0 поставщики майкрософт поддерживают этот флаг.

Если контекст поставщика был открыт с набором флагов CRYPT_SILENT, использование этого флага приводит к сбою, а последняя ошибка имеет значение NTE_SILENT_CONTEXT.

CRYPT_MACHINE_KEYSET
0x00000020
Закрытые ключи хранятся на локальном компьютере, а не под текущим пользователем.
CRYPT_USER_KEYSET
0x00001000
Закрытые ключи хранятся под текущим пользователем, а не под локальным компьютером, даже если PFX BLOB указывает, что они должны перейти на локальный компьютер.
PKCS12_PREFER_CNG_KSP
0x00000100
Указывает, что поставщик хранилища ключей CNG предпочтителен (KSP). Если CSP указан в PFX-файле, используется CSP, в противном случае предпочтителен KSP. Если поставщик ключевых показателей эффективности CNG недоступен, функция PFXImportCertStore завершится ошибкой.

Windows Server 2003 и Windows XP: это значение не поддерживается.

PKCS12_ALWAYS_CNG_KSP
0x00000200
Указывает, что CNG KSP всегда используется. При указании PFXImportCertStore пытается использовать CNG KSP независимо от сведений о поставщике в PFX-файле. Если CNG KSP недоступен, импорт не завершится ошибкой.

Windows Server 2003 и Windows XP: это значение не поддерживается.

PKCS12_ALLOW_OVERWRITE_KEY
0x00004000
Разрешить перезапись существующего ключа. Укажите этот флаг при возникновении сценария, в котором необходимо импортировать PFX-файл, содержащий имя ключа, которое уже существует. Например, при импорте PFX-файла возможно, что контейнер с тем же именем уже присутствует, так как для контейнеров ключей нет уникального пространства имен. Если вы создали "TestKey" на компьютере, а затем импортируете PFX-файл, который также имеет "TestKey" в качестве контейнера ключей, параметр PKCS12_ALLOW_OVERWRITE_KEY позволяет перезаписывать ключ.

Windows Server 2003 и Windows XP: это значение не поддерживается.

PKCS12_NO_PERSIST_KEY
0x00008000
Не сохраняйте ключ. Укажите этот флаг, если не хотите сохранять ключ. Например, если не требуется хранить ключ после проверки, вместо создания контейнера и его удаления можно указать этот флаг, чтобы немедленно удалить ключ.
Примечание Если флаг PKCS12_NO_PERSIST_KEY имеет значение *not*, ключи сохраняются на диске. Если вы не хотите сохранять ключи за пределами их использования, их необходимо удалить, вызвав функцию CryptAcquireContext с флагом CRYPT_DELETEKEYSET, установленным в параметре dwFlags.
Примечание Некоторые другие вопросы:
  • При использовании PKCS12_NO_PERSIST_KEY свойство CERT_KEY_CONTEXT_PROP_ID устанавливается внутри сертификата и содержит ключ.

  • Если PKCS12_NO_PERSIST_KEY не используется, свойство CERT_KEY_PROV_INFO_PROP_ID задано.

  • Если сертификат с не сохраняющимся ключом маршалируется в другой процесс, свойство CERT_KEY_CONTEXT_PROP_ID не будет маршалировано.

  • Для работы NO_PERSIST он должен находиться в одном процессе и пользователь PCCERT_CONTEXT должен поддерживать CERT_KEY_CONTEXT_PROP_ID. Это обычно применяется во время подтверждения TLS: если подтверждение выполняется внешне к процессу вызова в LSASS.exe, то при переходе из процесса вызова в LSASS PKCS12_NO_PERSIST_KEY (так как NCRYPT_KEY_HANDLE является указателем на структуру данных и не дескриптор ядра).

 
Windows Server 2003 и Windows XP: это значение не поддерживается.
PKCS12_INCLUDE_EXTENDED_PROPERTIES
0x0010
Импортируйте все расширенные свойства сертификата, сохраненные в сертификате при экспорте.

Windows Server 2003 и Windows XP: это значение не поддерживается.

0x10000000
Распаковка, но не сохраняйте результаты.

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

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

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

См. также

PFXExportCertStore

PFXExportCertStoreEx