| ||||
| ||||
Задача - имея только файл сертификата (PKCS7, *.pb7) расшифровать его содержимое (серийный номер, открытый ключ, срок действия и.т.д.). Использовать CryptDecodeObject не получилось, Enroll.getCertFromPKCS7 без имеющегося запроса на этот сертификат выдает ошибку (80090020 - невозможно установить сертификат) - знает ли кто способ для выполнения данной задачи? | ||||
Ответы: | ||||
| ||||
Общий подход: 1) CryptMsgOpenToDecode; 2) CryptMsgUpdate; 3) CryptMsgGetParam; Иногда помагает вместо первого пункта использовать CryptQueryObject. И, в свою очередь поинтересуюсь: а как использовалась функция CryptDecodeObject? | ||||
| ||||
Юрий, использовал CryptDecodeObject(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, PKCS_CONTENT_INFO,Request,RequestSize, CRYPT_DECODE_NOCOPY_FLAG,pResult,&sInf) - сработало, получил CRYPT_CONTENT_INFO, а дальше той же функцией не получается декодировать полученный BLOB, ошибки либо 80093103 (corrupted data, с данными все нормально, вручную устанавливается) для PKCS7_SIGNER_INFO, либо 8009310B (bad tag) для любой другой структуры | ||||
| ||||
Из структуры CRYPT_CONTENT_INFO можно получить CRYPT_DER_BLOB, а его передать функции CertCreateCertificateContext(...) получите CERT_CONTEXT, а дальше делайте с ним что хотите. | ||||
| ||||
Можно сделать попроще, без всяких CryptMsg*: CertOpenStore(CERT_STORE_PROV_FILENAME, ... ,имя_файла) В этом хранилище будет единственный файл (если в исходном файле он был один), его легко можно вытащить CertEnumCertificatesInStore. | ||||
| ||||
Правильно, и об этом варианте я тоже как-то раньше писал. Но в этом случае человеку, как мне кажется, нужно дать базу для дальнейшего изучения проблемы. А кратчайшие пути решения он сам потом найдет :) | ||||
| ||||
Александр, ваш метод не прокатил,к сожалению, возаращает 8009310B (Error in parsing certificate data) :( | ||||
| ||||
:( попробуйте способ, предложенный Kirill Sobolev. | ||||
| ||||
Спасибо всем, проблему решил с помощью CertOpenStore(CERT_STORE_PROV_PKCS7, ... ) | ||||