Статус: Новичок
Группы: Участники
Зарегистрирован: 13.06.2019(UTC) Сообщений: 9  Сказал(а) «Спасибо»: 5 раз
|
Автор: two_oceans  Не не не... это вредный совет, так как этот модуль очень старый, тем более из комплекта дельфи 7, многие функции/константы просто не будут работать, особенно если писать 64-разрядное приложение. Лучше скачать jwawincrypt, например, у меня 1.17 2007/09/05, там хотя бы несложно допилить описание типов хэндлов до 64 битных. Там же есть комментарии на английском к каждой функции, еще можно почитать MSDN игнорируя, что функции по мнению Майкрософт устарели и будут удалены в будущих версиях виндоуз. Как бы для сертификата даже особо и криптографии не надо, достаточно только нескольких функций. Для получения данных из подписанного файла Вам нужно: 1) выделить нужный текст, содержащий сертификат в Base64 из файла. Это можно сделать либо строковыми функциями либо xml парсерсом и его функциями. Предполагаю, что это Вы уже сделали. 2) декодировать сертификат из Base64, есть огромная куча реализаций для дельфи, но конечно ничто не мешает написать свою. К слову есть и реализация в CryptoAPI StringToBinary, но мне так и не удалось заставить ее работать - вместо декодирования кодирует еще раз, поэтому нашел исходник юнита base64 и скопипастил в свой юнит. Не весь юнит base64 подключил, так как там реализовано в виде объекта и тянулясь длинная объектная цепочка наследования и скомпилированная библиотека распухала в разы. 3) передать сертификат декодированный из base64 certData в Код:pCertCont:=CertCreateCertificateContext(X509_ASN_ENCODING or PKCS_7_ASN_ENCODING, PByte(CertData.str), CertData.Len);
У меня для удобства передачи между библиотеками свои строки - запись в которой str адрес буфера строки, Limit длина буфера выделенная, Len занятая длина буфера без конечного символа 0. Возвращается указатель на контекст сертификата, контекст удобен тем, данные закодированные в сертификате автоматически частично раскодированы и их можно уже и вручную выдергивать, но мы же не варвары, есть специальные функции для имени и различных хэшей сертификата. С другой стороны, вручную удобнее выдергивать серийный номер сертификата, так как в дельфи его надо заодно перевернуть. Перевод номера сертификата в десятичное представление - отдельная тема, так как у стандартных целочисленных типов не хватает длины чтобы вместить скажем 22 или 27 байт серийного номера.
4) получить поле субъекта (владельца) из контекста сертификата как строку: Код:rData:=CertGetNameString(pCertCont, strDisp, StrTp, pTpPara, @(Rez.str^), Rez.Limit);
Можно регулировать представление через strDisp самое обычное CERT_NAME_SIMPLE_DISPLAY_TYPE, для субъекта берем StrTp=0{он же CERT_NAME_SUBJECT_FLAG}, pTpPara=nil (параметров не требуется), возвращается записанная длина строки; 5) парсить строку субъекта.
В коде выше конечно отличная альтернатива шагам 4 и 5. Спасибо вроде получилось, я была в отчаянии, вы меня спасли когда сделаю покрасивее скину сюда вдруг кому пригодится
|