11.05.2005 16:51:02Декодирование файла PKCS7 (сертификат) Ответов: 8
Анатолий
Задача - имея только файл сертификата (PKCS7, *.pb7) расшифровать его содержимое (серийный номер, открытый ключ, срок действия и.т.д.). Использовать CryptDecodeObject не получилось, Enroll.getCertFromPKCS7 без имеющегося запроса на этот сертификат выдает ошибку (80090020 - невозможно установить сертификат) - знает ли кто способ для выполнения данной задачи?
 
Ответы:
11.05.2005 17:17:33Юрий
Общий подход:
1) CryptMsgOpenToDecode;
2) CryptMsgUpdate;
3) CryptMsgGetParam;

Иногда помагает вместо первого пункта использовать CryptQueryObject.

И, в свою очередь поинтересуюсь: а как использовалась функция CryptDecodeObject?
11.05.2005 17:37:57Анатолий
Юрий, использовал
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) для любой другой структуры
12.05.2005 12:43:37Александр
Из структуры CRYPT_CONTENT_INFO можно получить CRYPT_DER_BLOB, а его передать функции CertCreateCertificateContext(...) получите CERT_CONTEXT, а дальше делайте с ним что хотите.
12.05.2005 15:54:58Kirill Sobolev
Можно сделать попроще, без всяких CryptMsg*:
CertOpenStore(CERT_STORE_PROV_FILENAME, ... ,имя_файла)
В этом хранилище будет единственный файл (если в исходном файле он был один), его легко можно вытащить CertEnumCertificatesInStore.
12.05.2005 16:02:38Юрий
Правильно, и об этом варианте я тоже как-то раньше писал. Но в этом случае человеку, как мне кажется, нужно дать базу для дальнейшего изучения проблемы.

А кратчайшие пути решения он сам потом найдет :)
13.05.2005 17:37:14Анатолий
Александр, ваш метод не прокатил,к сожалению, возаращает 8009310B (Error in parsing certificate data) :(
16.05.2005 10:36:50Александр
:( попробуйте способ, предложенный Kirill Sobolev.
16.05.2005 11:21:41Анатолий
Спасибо всем, проблему решил с помощью CertOpenStore(CERT_STORE_PROV_PKCS7, ... )