CryptAcquireCertificatePrivateKey — создать контейнер постоянного ключа, который обращается к сертификату.

Как создать контейнер постоянного ключа, используя cryptoAPI из самозаверяющего сертификата PFX?

Я могу получить доступ к закрытому ключу в PFX через вызов CryptAcquireCertificatePrivateKey, но как мне импортировать пару закрытого и открытого ключей в контейнер ключей? Этот ключевой контейнер должен постоянно присутствовать в хранилище ключей USER после завершения процесса импорта.

Ждем предложений.

Спасибо


person Raj    schedule 18.04.2011    source источник


Ответы (1)


Один из способов — импортировать сертификат и пару ключей относительно PXImportCertStore.

Другой способ может быть интересен для понимания. Вы можете сохранить пару ключей, которую вы получаете относительно CryptAcquireCertificatePrivateKey, в любом новом контейнере ключей. Затем вы можете импортировать только сертификат (без закрытого ключа) и в конце вы должны установить контейнер с закрытым ключом в качестве свойства сертификата (CertSetCertificateContextProperty с CERT_KEY_PROV_INFO_PROP_ID).

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

person Oleg    schedule 21.04.2011
comment
@Олег- Спасибо. Мне удалось успешно экспортировать PFX после установки CRYPT_KEY_PROV_INFO. Но когда я импортирую тот же PFX с помощью мастера, он создает собственное имя контейнера ключей, а не то, которое я ранее установил при экспорте? Любая идея, почему это происходит. - person Raj; 11.05.2011
comment
@Raj: Если вы импортируете PFX, будет создан новый контейнер (обычно будет использоваться новый GUID), а свойство сертификата будет установлено так, чтобы оно указывало на новый контейнер. Название на упаковке не имеет значения. Это не часть сертификата или его закрытого ключа. Таким образом, имя контейнера ключей не будет экспортировано в PFX. - person Oleg; 11.05.2011
comment
@Oleg, поэтому, если я хочу сохранить исходное имя контейнера ключей, когда я собираюсь импортировать, программно (в моем случае имя контейнера ключей будет именем субъекта сертификата), установка структуры CRYPT_KEY_PROV_INFO перед импортом сохранит исходный ключ имя контейнера? Спасибо - person Raj; 11.05.2011
comment
@Raj: Извините за поздний ответ. Я мало играл с PFXImportCertStore и все это было несколько лет назад :-). Посмотрите ответ которые определенно работают, но точное поведение с ключевым контейнером лучше проверить самому. - person Oleg; 12.05.2011
comment
@Олег: Спасибо за ответ. Я собираюсь проверить это и обновить ответ. С уважением - person Raj; 12.05.2011
comment
@Oleg: Хотя я выполнил требуемую задачу для своего проекта, я попытался выполнить предложенный вами тест, попытавшись сохранить закрытый ключ в новом контейнере ключей с помощью CryptExportKey (PRIVATEKEYBLOB). У меня это не сработало, поскольку ЦС, выдавший сертификат, пометил ключ как неэкспортируемый. Я считаю, что это сработало бы, если бы иначе. - person Raj; 12.06.2011
comment
@Raj: Извините, но я не понимаю, почему вы пытаетесь использовать CryptExportKey, если у вас уже есть PFX файл? Если я правильно понял, вы хотите импортировать данные. Вы можете работать с файлом PFX в основном так же, как с существующим хранилищем сертификатов. Более того, я не понимаю, какой CA вы имеете в виду в своем последнем комментарии. Содержит ли файл PFX сертификат ЦС или он содержит дочерний сертификат с соответствующим закрытым ключом, а также сертификат ЦС без закрытого ключа? Не могли бы вы точнее описать вашу ситуацию. - person Oleg; 14.06.2011
comment
Я имею в виду сторонний ЦС, одобренный страной, в которой находится наш клиент. да, у PFX есть сертификат CA + дочерний сертификат с ключом pvt. В своем ответе вы попросили меня попытаться экспортировать ключ pvt из сертификата. Это то, что я пробовал. Но если вы упомянули об экспорте сертификата в новый сертификат, то я явно неправильно понял комментарий. - person Raj; 14.06.2011