Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline egow2806  
#1 Оставлено : 27 декабря 2024 г. 11:26:27(UTC)
egow2806

Статус: Активный участник

Группы: Участники
Зарегистрирован: 26.12.2024(UTC)
Сообщений: 34
Российская Федерация

Сказал(а) «Спасибо»: 25 раз
Поблагодарили: 1 раз в 1 постах
Всем привет, есть задача проверить подписанный PDF (со встроенной подписью) на валидность подписи и достать информацию о подписе и сертификату.

На Ubuntu собрал расширение и установил библиотеку Pycades, Код по проверке отделенных подписей формата .sig, .p7s работает на ура, а вот проверка совмещенной подписи не работает..
К сожалению не могу понять в чем проблема, при проверке натыкаюсь на ошибку Internal error. (0x8009100E) при этом на https://dss.cryptopro.ru/verify/#/signature файл проходит проверку

Для проверки использую вот такой код:


import pycades
import base64

signedata = pycades.SignedData()
signedata.ContentEncoding = pycades.CADESCOM_BASE64_TO_BINARY

sgn = open("/home/egorov/.venvs/crypto/Протокол_18122024_180922- подписан.pdf","rb").read()
encs = base64.b64encode(sgn)

signedata.VerifyCades(encs.decode('utf-8'), pycades.CADESCOM_CADES_BES)

try:
print(f"Проверка подписи: действительна")
except:
print(f"Проверка подписи: не действительна")


Спасибо.

Отредактировано пользователем 27 декабря 2024 г. 11:50:04(UTC)  | Причина: Не указана

Offline Андрей *  
#2 Оставлено : 27 декабря 2024 г. 12:36:05(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,687
Мужчина
Российская Федерация

Сказал «Спасибо»: 573 раз
Поблагодарили: 2303 раз в 1804 постах
Здравствуйте.

Потому что CAdESCOM не умеет работать с PAdES (встроенная ЭП).

Обычно это решается использованием itext проверка\подписание,
вероятно, искать в сети по: Python itext
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
egow2806 оставлено 27.12.2024(UTC)
Offline egow2806  
#3 Оставлено : 27 декабря 2024 г. 12:43:15(UTC)
egow2806

Статус: Активный участник

Группы: Участники
Зарегистрирован: 26.12.2024(UTC)
Сообщений: 34
Российская Федерация

Сказал(а) «Спасибо»: 25 раз
Поблагодарили: 1 раз в 1 постах
Спасибо.

Я правильно понял - то есть чтобы проверить pdf с встроенной, нужно сначала текстовую часть вытащить? (например как тут - https://habr.com/ru/articles/225647/). И если не сложно могли бы вы дать какие-то примеры реализации такой проверки?
Offline Андрей *  
#4 Оставлено : 27 декабря 2024 г. 13:31:57(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,687
Мужчина
Российская Федерация

Сказал «Спасибо»: 573 раз
Поблагодарили: 2303 раз в 1804 постах
Автор: egow2806 Перейти к цитате
Спасибо.

Я правильно понял - то есть чтобы проверить pdf с встроенной, нужно сначала текстовую часть вытащить? (например как тут - https://habr.com/ru/articles/225647/). И если не сложно могли бы вы дать какие-то примеры реализации такой проверки?


нет, подписывается не только текст.

На форуме можно поискать по itextsharp, подписание точно было, по проверке основное:
Код:

 PdfReader reader = new PdfReader(FilePDF);
 AcroFields af = reader.AcroFields;
            List<string> names = af.GetSignatureNames();

 PdfDictionary singleSignature = af.GetSignatureDictionary(name);
                PdfString asString1 = singleSignature.GetAsString(PdfName.CONTENTS);
                byte[] signatureBytes = asString1.GetOriginalBytes();

                RandomAccessFileOrArray safeFile = reader.SafeFile;

                PdfArray asArray = singleSignature.GetAsArray(PdfName.BYTERANGE);
                using (
                    Stream stream =
                        (Stream)
                        new RASInputStream(
                            new RandomAccessSourceFactory().CreateRanged(
                                safeFile.CreateSourceView(),
                                (IList<long>)asArray.AsLongArray())))
                {
                    using (MemoryStream ms = new MemoryStream((int)stream.Length))
                    {
                        stream.CopyTo(ms);
                        byte[] data = ms.GetBuffer();
 
                        ContentInfo contentInfo = new ContentInfo(data);  
                        SignedCms signedCms = new SignedCms(contentInfo, true);  
                        signedCms.Decode(signatureBytes); 
                        try
                        {
                            signedCms.CheckSignature(true); 
                        }
                        catch ( Exception ex)
                        {
                          ... ex.Message.ToString();
                         }


 и цикл по подписантам:
.. sinerInfo in signedCms.SignerInfos
... sinerInfo.Certificate - все данные из сертификата ...

...
..





Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
egow2806 оставлено 27.12.2024(UTC)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.