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


Функция NCryptImportKey (ncrypt.h)

Функция NCryptImportKey импортирует ключ API шифрования следующего поколения (CNG) из большого двоичного объекта памяти.

Синтаксис

SECURITY_STATUS NCryptImportKey(
  [in]           NCRYPT_PROV_HANDLE hProvider,
  [in, optional] NCRYPT_KEY_HANDLE  hImportKey,
  [in]           LPCWSTR            pszBlobType,
  [in, optional] NCryptBufferDesc   *pParameterList,
  [out]          NCRYPT_KEY_HANDLE  *phKey,
  [in]           PBYTE              pbData,
  [in]           DWORD              cbData,
  [in]           DWORD              dwFlags
);

Параметры

[in] hProvider

Дескриптор поставщика хранилища ключей.

[in, optional] hImportKey

Дескриптор криптографического ключа , с помощью которого были зашифрованы данные ключа в импортированном большом двоичном объекте . Это должен быть дескриптор того же ключа, который был передан в параметре hExportKey функции NCryptExportKey . Если этот параметр имеет значение NULL, предполагается, что blOB-объект ключа не шифруется.

[in] pszBlobType

Строка Юникода, заканчивающаяся null, которая содержит идентификатор, указывающий формат ключа BLOB. Эти форматы относятся к конкретному поставщику хранилища ключей. Сведения о форматах BLOB, поддерживаемых поставщиками Майкрософт, см. в разделе Примечания.

[in, optional] pParameterList

Адрес структуры NCryptBufferDesc , указывающей на массив буферов, содержащих сведения о параметрах для ключа.

[out] phKey

Адрес переменной NCRYPT_KEY_HANDLE , получающей дескриптор ключа. Завершив использование этого дескриптора, отпустите его, передав его в функцию NCryptFreeObject .

[in] pbData

Адрес буфера, содержащего blOB-объект ключа для импорта. Параметр cbData содержит размер этого буфера.

[in] cbData

Размер буфера pbData (в байтах).

[in] dwFlags

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

Значение Значение
NCRYPT_SILENT_FLAG Запрашивает, чтобы поставщик служб ключей (KSP) не отображал пользовательский интерфейс. Если поставщик должен отображать пользовательский интерфейс для работы, вызов завершается сбоем, а KSP должен задать код ошибки NTE_SILENT_CONTEXT как последнюю ошибку.
NCRYPT_REQUIRE_VBS_FLAG Указывает, что ключ должен быть защищен с помощью защиты на основе виртуализации (VBS). По умолчанию создается сохраненный ключ для перекрестной загрузки, хранящийся на диске, который сохраняется в течение циклов перезагрузки.

Если VBS недоступен, операция завершится ошибкой. (*См. примечания)
NCRYPT_PREFER_VBS_FLAG Указывает, что ключ должен быть защищен с помощью защиты на основе виртуализации (VBS). По умолчанию создается сохраненный ключ для перекрестной загрузки, хранящийся на диске, который сохраняется в течение циклов перезагрузки.

Операция создаст ключ с программной изоляцией, если VBS недоступен. (*См. примечания)
NCRYPT_USE_PER_BOOT_KEY_FLAG Дополнительный флаг, который можно использовать вместе с NCRYPT_REQUIRE_VBS_FLAG или NCRYPT_PREFER_VBS_FLAG. Указывает безопасности на основе виртуализации (VBS) защитить клиентский ключ с помощью ключа для каждой загрузки, который хранится на диске, но не может использоваться повторно в циклах загрузки. (*См. примечания)

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

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

Возможные коды возврата включают, помимо прочего, следующие:

Код возврата Описание
ERROR_SUCCESS Функция выполнена успешно.
NTE_BAD_FLAGS Параметр dwFlags содержит недопустимое значение.
NTE_EXISTS Ключ с указанным именем уже существует, и NCRYPT_OVERWRITE_KEY_FLAG не указан.
NTE_INVALID_HANDLE Недопустимый параметр hProvider .
NTE_INVALID_PARAMETER Один или несколько параметров недопустимы.
NTE_NO_MEMORY Произошел сбой выделения памяти.
NTE_VBS_UNAVAILABLE VBS недоступен.
NTE_VBS_CANNOT_DECRYPT_KEY Сбой операции расшифровки VBS.

Комментарии

Важно!

Сведения о флагах VBS относятся к предварительной версии продукта, который может быть существенно изменен до его коммерческого выпуска. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.

Служба не должна вызывать эту функцию из функции StartService. Если служба вызывает эту функцию из функции StartService , может возникнуть взаимоблокировка, и служба может перестать отвечать.

В следующих разделах описывается поведение, специфичное для поставщиков хранилища ключей Майкрософт.

  • Microsoft Software KSP
  • Поставщик ключевых показателей эффективности смарт-карт Майкрософт

Microsoft Software KSP

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

Если имя ключа не указано, microsoft Software KSP обрабатывает ключ как временный и не сохраняет его постоянно. Для типа NCRYPT_OPAQUETRANSPORT_BLOB имя ключа сохраняется в большом двоичном объекте при экспорте. Для других форматов BLOB имя можно указать в параметре буфера NCRYPTBUFFER_PKCS_KEY_NAME в параметре pParameterList .

В Windows Server 2008 и Windows Vista с помощью приведенного выше метода можно сохранять только ключи, импортированные в виде больших двоичных объектов с конвертом PKCS #7 (NCRYPT_PKCS7_ENVELOPE_BLOB) или PKCS #8 (NCRYPT_PKCS8_PRIVATE_KEY_BLOB). Чтобы сохранить ключи, импортированные с помощью других типов BLOB на этих платформах, используйте метод, описанный в разделе Импорт и экспорт ключей.

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

Термин Описание
NCRYPT_NO_KEY_VALIDATION Не проверяйте открытую часть пары ключей. Этот флаг применяется только к парам открытых и закрытых ключей.
NCRYPT_DO_NOT_FINALIZE_FLAG Не завершайте работу ключа. Этот параметр полезен, когда необходимо добавить или изменить свойства ключа после его импорта. Необходимо завершить работу ключа, прежде чем его можно будет использовать, передав дескриптор ключа в функцию NCryptFinalizeKey . Этот флаг поддерживается для закрытых ключей PKCS 7 и PKCS 8, но не для открытых ключей.
NCRYPT_MACHINE_KEY_FLAG Ключ применяется к локальному компьютеру. Если этот флаг отсутствует, ключ применяется к текущему пользователю.
NCRYPT_OVERWRITE_KEY_FLAG Если ключ уже существует в контейнере с указанным именем, существующий ключ будет перезаписан. Если этот флаг не указан и ключ с указанным именем уже существует, эта функция вернет NTE_EXISTS.
NCRYPT_WRITE_KEY_TO_LEGACY_STORE_FLAG Кроме того, сохраните ключ в хранилище прежних версий. Это позволяет использовать ключ с CryptoAPI. Этот флаг применяется только к ключам RSA.

Поставщик ключевых показателей эффективности смарт-карт Майкрософт

Набор форматов и флагов ключевых BLOB-объектов, поддерживаемых этим поставщиком служб KSP, идентичен набору, поддерживаемму поставщиком программного обеспечения Майкрософт.

В Windows Server 2008 и Windows Vista поставщик параметров microsoft Smart Card KSP импортирует все ключи в KSP программного обеспечения Майкрософт. Таким образом, ключи нельзя сохранить на смарт-карте с помощью этого API, и рекомендации, приведенные в приведенном выше разделе, применимы при попытке сохранить ключи в поставщике программного обеспечения Майкрософт.

В Windows Server 2008 R2 и Windows 7 поставщик хранилища ключей смарт-карт Майкрософт может импортировать закрытый ключ на смарт-карту при условии выполнения следующих условий:

  • Имя контейнера ключей на карточке является допустимым.
  • Смарт-карта поддерживает импорт закрытых ключей.
  • Для следующих двух разделов реестра задано значение DWORD :0x1
    • HKLM\SOFTWARE\Microsoft\Cryptography\Defaults\Provider\Microsoft Base Smart Card Crypto Provider\AllowPrivateExchangeKeyImport
    • HKLM\SOFTWARE\Microsoft\Cryptography\Defaults\Provider\Microsoft Base Smart Card Crypto Provider\AllowPrivateSignatureKeyImport

Если имя контейнера ключей имеет значение NULL, поставщик служб microsoft Smart Card KSP обрабатывает ключ как временный и импортирует его в KSP программного обеспечения Майкрософт.

Дополнительные требования к оборудованию для ключей VBS

Хотя на компьютере может быть установлена соответствующая ОС, для создания и защиты ключей с помощью VBS необходимо выполнить следующие дополнительные требования к оборудованию.

  • VBS включен (см. раздел Безопасность на основе виртуализации (VBS))
  • TPM включен
    • Для сред без операционной системы требуется TPM 2.0.
    • Для сред виртуальных машин поддерживается vTPM (Виртуальный TPM).
  • Bios необходимо обновить до UEFI с профилем SecureBoot

Дополнительные сведения о требованиях к оборудованию:

  • VBS имеет несколько требований к оборудованию для запуска, включая Hyper-V (гипервизор Windows), 64-разрядную архитектуру и поддержку IOMMU. Полный список требований к оборудованию VBS можно найти здесь.
  • Требования к высокозащищенным устройствам можно найти здесь.

Требования

Требование Значение
Минимальная версия клиента Windows Vista [классические приложения | Приложения UWP]
Минимальная версия сервера Windows Server 2008 [классические приложения | Приложения UWP]
Целевая платформа Windows
Header ncrypt.h
Библиотека Ncrypt.lib
DLL Ncrypt.dll

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

NCryptBuffer

NCryptCreatePersistedKey