27.03.2006 17:52:55хранилище сертификатов Ответов: 6
gromozeka
Добрый день!
Не могли б вы пояснить один момент, пожалуйста...
Ибо не совсем понятно как store работает...
Установлена КриптоПРо 2.0
вот покопался в старом коде и наткнулся на следующее:

//получаю hSystemStore
*hSystemStore = CertOpenStore(
CERT_STORE_PROV_SYSTEM ,
0,
0,
CERT_STORE_OPEN_EXISTING_FLAG|
CERT_STORE_READONLY_FLAG|
CERT_SYSTEM_STORE_CURRENT_USER,
L"MY"
);

// ищу сертификат в с Subject = lpCertSubjectUnicode
*pCertContext=CertFindCertificateInStore (*hSystemStore,
X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
0,
CERT_FIND_SUBJECT_STR,
lpCertSubjectUnicode ,
NULL);

Не понятно следующее:
CertOpenStore я так понимаю открывает виндовое store, где нибудь по этому адресу:
HKEY_CURRENT_USER\Software\Microsoft\SystemCertificates\My

Тогда каким образом функция CertFindCertificateInStore находит сертификат ( а далее получаю и Private key) с именем lpCertSubjectUnicode , если сертификат с этим именем был установлен, к примеру, сюда:
HKEY_LOCAL_MACHINE\SOFTWARE\Crypto Pro\Settings\USERS\S-1-5-21-897209132-852581992-626671869-3408\Keys

Получается сертификат надо инсталлировать, чтоб он попадал в куда нибудь в store Windows (в MY или CA), и именно там сертификат ссылается на хранилище в криптопро (HKEY_LOCAL_MACHINE\SOFTWARE\Crypto Pro\............)

или я не допонял что, подскажите, пожалуйста!
 
Ответы:
28.03.2006 11:31:12Kirill Sobolev
"CertOpenStore я так понимаю открывает виндовое store, где нибудь по этому адресу:
HKEY_CURRENT_USER\Software\Microsoft\SystemCertificates\My" - в приведенном Вами коде - именно так.

"если сертификат с этим именем был установлен, к примеру, сюда:
HKEY_LOCAL_MACHINE\SOFTWARE\Crypto Pro\Settings\USERS\S-1-5-21-897209132-852581992-626671869-3408\Keys"
туда был установлен контейнер секретного ключа, который содержит (хотя может и не содержать) сертификат.

"Получается сертификат надо инсталлировать, чтоб он попадал в куда нибудь в store Windows (в MY или CA), и именно там сертификат ссылается на хранилище в криптопро (HKEY_LOCAL_MACHINE\SOFTWARE\Crypto Pro\............)" - абсолютно верно. Сыылка на секретный ключ может быть только у сертификатов, установленных в хранилище.

28.03.2006 15:37:48gromozeka
Спасибо большое...
Еще вопросик маленький...

Делаю так:
//strContainerName имя контейнера
CryptAcquireContext(hProv, strContainerName,strCSPName,71 , 0);
*hSystemStore = CertOpenSystemStore(*hProv, "MY");
*pCertContext=CertFindCertificateInStore (*hSystemStore,
X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
0, CERT_FIND_ANY,
NULL, NULL);

Означает ли это, что будет найден (хоть и используется CERT_FIND_ANY ) только ОДИН сертификат... потому как в CryptAcquireContext я указал имя контейнера..?

спасибо.
28.03.2006 15:42:46Kirill Sobolev
Нет, не означает
28.03.2006 15:51:37gromozeka
Позвольте узнать почему?
Ведь
CryptAcquireContext(hProv, strContainerName,strCSPName,71 , 0);
*hSystemStore = CertOpenSystemStore(*hProv, "MY");

означает, что hSystemStore указывает на хранилище сертификатов с непосредственной привязкой к strContainerName и к опр. криптопровайдеру. (HKEY_LOCAL_MACHINE\SOFTWARE\Crypto Pro\Settings\USERS\S-1-5-21-897209132-852581992-626671869-3408\Keys\1111eb06-d8b3-4aaa-94a4-b22111111111 - strContainerName равно последнему)...
или ошибаюсь я?

или в хранилище могут быть несколько сертификатов с так сказать "ссылкой" на один контейнер (то есть private key) крипто про ?
28.03.2006 16:33:19gromozeka
касательно этого:"или в хранилище могут быть несколько сертификатов с так сказать "ссылкой" на один контейнер (то есть private key) крипто про ?"...
я пожалуй не прав..
Ведь сертифика - public key по сути. а Private, который в контейнере, составляет ему пару. Это так?

И как вообще тогда можно найти определенный сертификат, зная имя контейнера крипто-про-шного, подскажите?
30.03.2006 11:52:34Kirill Sobolev
Да, Вы ошибаетесь. Провайдер не используется как фильтр при открытии хранилища.
Конечно могут быть несколько. Взяли, установили несколько одинаковых сертификатов с привязкой к одному контейнеру, или выпустили новый сертификат на том же ключе, или просто программным способом привязали случайный сертификат с случайному контейнеру - много вариантов. CrytoAPI при создании ссылки на контейнер не проверяет ключи.
Если Вы знаете имя контейнера то Вы можете перебрать все сертификаты и выбрать те, которые ссылаются именно на этот контейнер.