| ||||
| ||||
Добрый день! Не могли б вы пояснить один момент, пожалуйста... Ибо не совсем понятно как 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\............) или я не допонял что, подскажите, пожалуйста! | ||||
Ответы: | ||||
| ||||
"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\............)" - абсолютно верно. Сыылка на секретный ключ может быть только у сертификатов, установленных в хранилище. | ||||
| ||||
Спасибо большое... Еще вопросик маленький... Делаю так: //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 я указал имя контейнера..? спасибо. | ||||
| ||||
Нет, не означает | ||||
| ||||
Позвольте узнать почему? Ведь 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) крипто про ? | ||||
| ||||
касательно этого:"или в хранилище могут быть несколько сертификатов с так сказать "ссылкой" на один контейнер (то есть private key) крипто про ?"... я пожалуй не прав.. Ведь сертифика - public key по сути. а Private, который в контейнере, составляет ему пару. Это так? И как вообще тогда можно найти определенный сертификат, зная имя контейнера крипто-про-шного, подскажите? | ||||
| ||||
Да, Вы ошибаетесь. Провайдер не используется как фильтр при открытии хранилища. Конечно могут быть несколько. Взяли, установили несколько одинаковых сертификатов с привязкой к одному контейнеру, или выпустили новый сертификат на том же ключе, или просто программным способом привязали случайный сертификат с случайному контейнеру - много вариантов. CrytoAPI при создании ссылки на контейнер не проверяет ключи. Если Вы знаете имя контейнера то Вы можете перебрать все сертификаты и выбрать те, которые ссылаются именно на этот контейнер. | ||||