Ситуация следующая. В хранилище Му нахожу сертификат. Как извлечь секретный ключ из хранилища? Функция CryptAcquireCertificatePrivateKey дает указатель на провайдера, который используем в стандартных функциях для дальнейших манипуляций (подписывание и т.д.). А как получить сам секретный ключ?
если я ничего не путаю то секретный ключ нельзя извлечь из хранилища не зная пароля на него если ты конечно имеешь ввиду X.509 сертификаты
Мне все это надо для подписи моей проги легальным сертификатом. У меня есть доступ к компу на котором хранится легальный сертификат. Я уже скачал сертификат. Для подписи проги необходим еще и секретный ключ. А его как достать?
пароль насколько я понял используется пользователя. а если комп под этим юзером загружен, то ОС сама вводит пароль. так что надо только вытащить ключ
с чего ты взял что пароль на логин в систему пользователя и пароль на ключ одинаковые? и вообще ключ может быть помечен как неэкспортируемый, тогда ты его не вытащишь...
PFXExportCertStoreEx() а далее распарсить бинарные данные сертификата которые, она вернёт? Лол, неэкспортируемые ключи так же можно вытащить, для этого требуется всего-лишь пропатчить несколько условных переходов во внутренностях rsaenh.dll
Cr4sh С помощью функции PFXExportCertStoreEx я получил PFX контейнер с паролем. Если применить функцию PFXVerifyPassword к данному контейнеру, находящемуся в памяти, то функция утверждает, что пароль верен. Если я записываю PFX контейнер в файл, а потом снова считываю файл в буфер, то функция PFXVerifyPassword говорит о том, что пароль не верен. Где ошибка?
CRYPT_DATA_BLOB, который в PFXVerifyPassword передаётся, точно один и тот же в обоих случаях? Если установить сертификат в ручную с помощью соотв. мастера - пароль принимается?
Конечно! Берешь отладчик, аттачишься к оснастке управления сертификатами и трассируешь процедуру экспорта начиная с вызова PFXExportCertStoreEx сначала для обычного и затем для неэкспортируемого сертификата. Сравнивая две трассы исполнения находишь условные переходы, которые нужно запатчить.
Код (Text): invoke CertOpenSystemStoreA,0,MY mov [border],eax invoke PFXExportCertStoreEx,[border],blob,PASS,0,4 invoke GlobalAlloc,0,[blob.cbdata] mov [blob.pbdata],eax invoke PFXExportCertStoreEx,[border],blob,PASS,0,4 invoke CreateFileA,filepfx,GENERIC_WRITE,3,0,2,0x80,0 mov [val],eax invoke WriteFile,[val],[blob.pbdata],[blob.cbdata],blob.cbdata,0 invoke CloseHandle,[val] invoke CertCloseStore,[border],0 invoke GlobalFree,[blob.pbdata] Проверка условий удалена. Если в этом коде вставить функцию PFXVerifyPassword, то она отрабатывает отлично. Но если с помощью мастера импортировать pfx файл или другой прогой попытаться открыть pfx файл, то возникает ошибка - неправильный пароль
Решил задачу по-тупому. Просто подставил в функцию PFXExportCertStoreEx вместо пароля 0 (пустой пароль). Все работает. Мастер импорта не ругается.