19.06.2002 15:09:45Сертификат с закрытым ключом на дискете Ответов: 4
Valentin
Добрый день.
Прежде чем задать вопрос, хочу поблагодарить КриптоПро за этот форум, да и вообще за примеры, на этом сайте.
Вопрос следующий: я хочу хранить сертификаты и приватные ключи клиентов на дискете (использую пока майкрософтовский CSP), не устанавливая их в реестр. Как это реализовать?
(на дискете находится сертификат (*.cer) с приваткеем (*.pvk))
На сколько я понимаю, закрытый ключ находиться в контейнере CSP и сертификат привязан к этому контейнеру. Но как сделать так, чтобы ключ не находился в конейнере (в реестре), а был на дискете? И что это за свойство сертификата CERT_PVK_FILE_PROP_ID? Когда его использует CSP?

Спасибо большое.
Валентин
 
Ответы:
20.06.2002 21:59:56kure
Сделать это можно наверн только в два шага.
Микрософт по принципу всегда делает ключи в реестр а на 2000 и ХР в профайл. Но после этого можно пользовать PFX для экспорта закрытого ключа и сертификата в файл (на туже дискету) а ключ удалить через DELETE_KEYSET.
Собственные приложения должны справиться с PFX (в CryptoAPI и CAPICOM 2.0 есть функции для работы с ним) и если посмотрите в дискуссии по CAPICOM там на этой неделе вопрос этот активно обсуждался.
24.06.2002 18:04:27Valentin
Да, я пробовал так сделать: экспортировал в PFX сертификат с закрытым ключем, а на клиенте импортирую
hCertStore = PFXImportCertStore(...) и далее достаю оттуда сам сертификат
PCCERT_CONTEXT pCert = CertEnumCertificatesInStore(hCertStore, NULL). Затем пытаюсь использовать его, но Crypto API не может найти private key.
Я решил посмотреть имя контейнера с ключами: запрашиваю HCRYPTPROV (CryptAcquireCertificatePrivateKey) и смотрю имя контейнера. На сколько я понимаю это имя контейнера в реестре , где лежали ключи перед экспортом сертификата (или я не прав?) и на локальной машине этого контейнера естественно нет ;((
Если я импортирую этот сертификат в персональное хранилище ("MY")CertAddCertificateContextToStore(...) то все работает. Как вообще указать Crypto API, что тип ключевого ностителя является дискета и как это сделано у вас? () желательно бы кусочек кода. Т.е. имя контейнера я задал, а вот тип носителя не могу найти как задать. Такое впечатление, что майкрософтовский CSP не поддерживает кроме реестра ничего.
24.06.2002 20:04:39kure
Когда сертификат с ключом в микрософте экспортируется дополнительно прописывается имя контейнера и имя криптопровайдера. Вот например:

BMPString
Microsoft Base Cryptographic Provider v1.0

SEQUENCE
OBJECT IDENTIFIER 1 2 840 113549 1 9 20

SET
BMPString
afba20e7190f110307020533359aca51_e3c70ceb-b98f-4
1fc-9515-b97bb1e369a5

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

Сертификатом без AcquireContext пользоваться можно, но толко в тех функциях, которые это делают сами (например, CryptSignMessage). Дело в том что в справочник вместе с сертификатом прописывается атрибут, ссылающийся на провайдер и ключ в виде структуры CRYPT_KEY_PROV_INFO. Функции верхнего уровня сами грузят ключ, а низкоуровневым функциям нужен handle от провайдера. Действительно микрософт может работать только с реестром и хранить ключи на дискете его (наверно) не удасться научить.
27.07.2004 13:08:49Алексей
У меня возник тот же самый вопрос. Кто-нибудь разобрался с этим?

CERT_PVK_FILE_PROP_ID - зачем он нужен?
Функция CEnroll.addBlobPropertyToCertificate тоже его может использовать, но какой толк от этого?