logo
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline korian2001  
#1 Оставлено : 27 ноября 2017 г. 13:44:49(UTC)
korian2001

Статус: Новичок

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

Здравствуйте!

При проверке подписи, созданной по ГОСТ Р 34.10-2012
использовался пример с библиотекой itextsharp.dll версии "5.5.12.0":

// Открываем документ
PdfReader reader = new PdfReader(document);
// Получаем подписи из документа
AcroFields af = reader.AcroFields;
List<string> names = af.GetSignatureNames();
foreach (string name in names)
{
// Проверяем подпись
PdfPKCS7 pk = af.VerifySignature(name);
....
На этой строчке возникает ошибка: "Digest 1.2.643.7.1.1.2.2 not recognised."
В Adobe Reader с помощью КриптоПРО PDF подпись валидируется.
С сертификатами по ГОСТ 34.10-2001 Ошибок не возникает.

Вопрос. Как валидировать присоединенную подпись в коде созданную по ГОСТ Р 34.10-2012?
Offline Максим Коллегин  
#2 Оставлено : 28 ноября 2017 г. 6:21:50(UTC)
Максим Коллегин

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

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 5,406
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 11 раз
Поблагодарили: 501 раз в 455 постах
Спасибо за вопрос, постараемся подсказать в ближайшее время.
Знания в базе знаний, поддержка в техподдержке
Offline Артём Макаров  
#3 Оставлено : 28 ноября 2017 г. 9:41:42(UTC)
Артём Макаров

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

Группы: Участники
Зарегистрирован: 20.02.2017(UTC)
Сообщений: 36

Поблагодарили: 11 раз в 11 постах
Добрый день.

Попробуйте данный пример (вложение).

NewDotNetPdfVerify.cs (6kb) загружен 37 раз(а).
Техническую поддержку оказываем тут
Наша база знаний
Offline korian2001  
#4 Оставлено : 29 ноября 2017 г. 9:24:01(UTC)
korian2001

Статус: Новичок

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

Спасибо! Ваш пример помог!
Offline Павел_К  
#5 Оставлено : 21 мая 2018 г. 12:37:08(UTC)
Павел_К

Статус: Участник

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

Добрый день!
Как тоже самое можно сделать только на Delphi.
Меня интересует проверка pdf файла на наличие в нем присоединенной электронной подписи,а так же ее валидности.
Если можно пример на Delphi или пример Вашей утилиты через командную строку.
Offline Андрей Писарев  
#6 Оставлено : 22 мая 2018 г. 0:25:14(UTC)
Андрей Писарев

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

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

Сказал «Спасибо»: 266 раз
Поблагодарили: 1067 раз в 853 постах
Автор: Павел_К Перейти к цитате
Добрый день!
Как тоже самое можно сделать только на Delphi.
Меня интересует проверка pdf файла на наличие в нем присоединенной электронной подписи,а так же ее валидности.
Если можно пример на Delphi или пример Вашей утилиты через командную строку.


Здравствуйте.

Можно начать с простого:

Главная > Продукты > Дополнительное ПО > КриптоПро PDF

Документация:
Цитата:

КриптоПро PDF. Руководство по эксплуатации.
КриптоПро PDF. Руководство по автоматизации создания и проверки электронных подписей.
КриптоПро PDF. Формуляр.



Цитата:
1.2.2. Проверка электронных подписей
Для запуска процесса проверки ЭП в пакете документов PDF, выполните следующую команду:
> cppdfutil.exe verify [параметры]


Offline Павел_К  
#7 Оставлено : 22 мая 2018 г. 8:24:34(UTC)
Павел_К

Статус: Участник

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

Добрый день!
Подскажите пожалуйста как проверить файл на электронную подпись находящийся в папке "c:\1", желательно, чтобы если файл подписан то он был скопирован в "c:\2"
пример строки из Вашей инструкции

C:\Program Files\Crypto Pro\pdf\cppdfutil.exe verify --in-dir c:\1 --out-dir c:\2
Offline Андрей Писарев  
#8 Оставлено : 22 мая 2018 г. 8:59:29(UTC)
Андрей Писарев

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

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

Сказал «Спасибо»: 266 раз
Поблагодарили: 1067 раз в 853 постах
Создайте командный файл и выполните:
Код:
 

"C:\Program Files\Crypto Pro\pdf\cppdfutil.exe" verify -in-dir "c:\1\" -out-dir "c:\2\"

pause 



Что в результате?
Offline Павел_К  
#9 Оставлено : 22 мая 2018 г. 12:21:11(UTC)
Павел_К

Статус: Участник

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

cppdfutil.exe verify --in-dir=D:\1\ --out-dir=D:\2\
выдает - внутренняя ошибка

если использовать Ваш совет то файлов не видит
Offline Андрей Писарев  
#10 Оставлено : 22 мая 2018 г. 14:30:46(UTC)
Андрей Писарев

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

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

Сказал «Спасибо»: 266 раз
Поблагодарили: 1067 раз в 853 постах
Автор: Павел_К Перейти к цитате
cppdfutil.exe verify --in-dir=D:\1\ --out-dir=D:\2\
выдает - внутренняя ошибка

если использовать Ваш совет то файлов не видит


Почему должно работать с неправильными параметрами?

Приложите снимок из командной строки, то, что указал выше.
Offline Павел_К  
#11 Оставлено : 23 мая 2018 г. 5:29:22(UTC)
Павел_К

Статус: Участник

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

Добрый день.
Высылаю скрин командной строки.
В d:\1\ - находиться подписанный файл
oshibka.png (9kb) загружен 13 раз(а).
Offline LONGPDF  
#12 Оставлено : 4 января 2019 г. 10:19:58(UTC)
LONGPDF

Статус: Новичок

Группы: Участники
Зарегистрирован: 02.01.2019(UTC)
Сообщений: 5

Автор: Артём Макаров Перейти к цитате
Добрый день.

Попробуйте данный пример (вложение).

NewDotNetPdfVerify.cs (6kb) загружен 37 раз(а).


Также перешли на ГОСТ 2012. Для проверки валидности пользуемся указанным примером. Но не знаю как получить Причину (REASON) и Место (LOCATION), добавленные нами в подпись.
Добавляли в PdfSinnatureAppearance.
Приведите, пожалуйста, пример кода для получения значений REASON и LOCATION. Спасибо.
Offline Артём Макаров  
#13 Оставлено : 10 января 2019 г. 11:29:41(UTC)
Артём Макаров

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

Группы: Участники
Зарегистрирован: 20.02.2017(UTC)
Сообщений: 36

Поблагодарили: 11 раз в 11 постах
Получение LOCATION и REASON

Код:
// PdfDictionary singleSignature, получение - см. пример

PdfString location = singleSignature.GetAsString(PdfName.LOCATION);
PdfString reason = singleSignature.GetAsString(PdfName.REASON); 
Техническую поддержку оказываем тут
Наша база знаний
Offline LONGPDF  
#14 Оставлено : 10 января 2019 г. 13:16:46(UTC)
LONGPDF

Статус: Новичок

Группы: Участники
Зарегистрирован: 02.01.2019(UTC)
Сообщений: 5

Автор: Артём Макаров Перейти к цитате
Получение LOCATION и REASON

Код:
// PdfDictionary singleSignature, получение - см. пример

PdfString location = singleSignature.GetAsString(PdfName.LOCATION);
PdfString reason = singleSignature.GetAsString(PdfName.REASON); 


Спасибо, это я мог получить и ранее. Однако, она закодирована. Раскодировать как для сертификата (в Вашем примере выше):
// Декодируем подпись
signedCms.Decode(signatureBytes);
не получается. Хоть и подставлял location.
Offline Артём Макаров  
#15 Оставлено : 10 января 2019 г. 13:23:10(UTC)
Артём Макаров

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

Группы: Участники
Зарегистрирован: 20.02.2017(UTC)
Сообщений: 36

Поблагодарили: 11 раз в 11 постах
Кто "она"? Что значит "Раскодировать как для сертификата"?

Какой метод не отрабатывает? Ошибка в signedCms.Decode?
Техническую поддержку оказываем тут
Наша база знаний
Offline LONGPDF  
#16 Оставлено : 10 января 2019 г. 13:33:41(UTC)
LONGPDF

Статус: Новичок

Группы: Участники
Зарегистрирован: 02.01.2019(UTC)
Сообщений: 5

Автор: Артём Макаров Перейти к цитате
Кто "она"? Что значит "Раскодировать как для сертификата"?

Какой метод не отрабатывает? Ошибка в signedCms.Decode?



Код:

namespace _666
{
    class Program
    {
        static void Main(string[] args)
        {
            PdfReader reader = null;
            reader = new PdfReader("C:\\DISTRIB\\1.pdf");

           // Получаем подписи из документа
            AcroFields af = reader.AcroFields;

            List<string> names = af.GetSignatureNames();
            foreach (string name in names)
            {

                string message = "Signature name: " + name;
                message += "\nSignature covers whole document: " + af.SignatureCoversWholeDocument(name);
                message += "\nDocument revision: " + af.GetRevision(name) + " of " + af.TotalRevisions;

                

                // Проверяем подпись
                PdfDictionary singleSignature = af.GetSignatureDictionary(name);
                //PdfString asString1 = singleSignature.GetAsString(PdfName.CONTENTS);

                /////////////////////
                //Указываю LOCATION//
                ////////////////////
                PdfString asString1 = singleSignature.GetAsString(PdfName.LOCATION);

                //далее все в точности как по примеру

                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 по сообщению.
                        // Это необходимо для создания объекта SignedCms.
                        ContentInfo contentInfo = new ContentInfo(data);

                        // Создаем SignedCms для декодирования и проверки.
                        SignedCms signedCms = new SignedCms(contentInfo, true);

                        // Декодируем подпись
                        signedCms.Decode(signatureBytes);

                        bool checkResult;

                        try
                        {
                            signedCms.CheckSignature(true);
                            checkResult = true;
                        }
                        catch (Exception)
                        {
                            checkResult = false;
                        }

                        message += "\nDocument modified: " + !checkResult;

                        foreach (var sinerInfo in signedCms.SignerInfos)
                        {
                            message += "\nCertificate " + sinerInfo.Certificate;
                            X509Certificate2 cert = signedCms.Certificates[0];
                            var isCapiValid = cert.Verify();
                            message += "\nCAPI Validation: " + isCapiValid.ToString();


                            foreach (var attribute in sinerInfo.SignedAttributes)
                            {
                                if (attribute.Oid.Value == "1.2.840.113549.1.9.5")
                                {
                                    Pkcs9SigningTime signingTime = attribute.Values[0] as Pkcs9SigningTime;
                                    message += "\nDate: " + signingTime.SigningTime;
                                }
                            }
                            message += "\n\n";
                        }
                        
                        Console.WriteLine(message);
                        Console.ReadKey();
                    }
                }
            }
        }
    }
}




>>Какой метод не отрабатывает? Ошибка в signedCms.Decode?
Да, ошибка именно на signedCms.Decode(signatureBytes)

Offline Артём Макаров  
#17 Оставлено : 10 января 2019 г. 13:43:54(UTC)
Артём Макаров

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

Группы: Участники
Зарегистрирован: 20.02.2017(UTC)
Сообщений: 36

Поблагодарили: 11 раз в 11 постах
Вы пытаетесь проверить строку, содержащую LOCATION, как подпись. Очевидно, при декодировании строки как подписи вы получаете ошибку.

Проверить надо, как и раньше, подпись (asString1). В location у вас текстовое представление LOCATION, указанное при подписи. В декодировании оно не нуждается, можно использовать метод .ToString()

Код:
 
// ...
string message = "Signature name: " + name;
message += "\nSignature covers whole document: " + af.SignatureCoversWholeDocument(name);
message += "\nDocument revision: " + af.GetRevision(name) + " of " + af.TotalRevisions;
Console.WriteLine(message);

// Проверяем подпись
PdfDictionary singleSignature = af.GetSignatureDictionary(name);
PdfString asString1 = singleSignature.GetAsString(PdfName.CONTENTS);
byte[] signatureBytes = asString1.GetOriginalBytes();

RandomAccessFileOrArray safeFile = reader.SafeFile;

// Получение location и reason
PdfString location = singleSignature.GetAsString(PdfName.LOCATION);
PdfString reason = singleSignature.GetAsString(PdfName.REASON);
// произвольный код работы с location и reason

PdfArray asArray = singleSignature.GetAsArray(PdfName.BYTERANGE);
using (Stream stream = (Stream)new RASInputStream(
// ...
Техническую поддержку оказываем тут
Наша база знаний
Offline LONGPDF  
#18 Оставлено : 10 января 2019 г. 13:59:46(UTC)
LONGPDF

Статус: Новичок

Группы: Участники
Зарегистрирован: 02.01.2019(UTC)
Сообщений: 5

2PDF.jpg (19kb) загружен 9 раз(а). 1PDF.jpg (188kb) загружен 10 раз(а).

Возможно я крайне невыразительно формулирую свои вопросы, но прошу помощи. Вот подпись, и в ней, например REASON = Сдал.
Однако, я вместо "Сдал", получаю крикозябли. Я полагал, что это связано с применением нового ГОСТ 2012, так как на 2001 у меня все работало.
Прошу Вас помочь с ответом, как получить "Сдал"?
Offline Артём Макаров  
#19 Оставлено : 10 января 2019 г. 14:10:36(UTC)
Артём Макаров

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

Группы: Участники
Зарегистрирован: 20.02.2017(UTC)
Сообщений: 36

Поблагодарили: 11 раз в 11 постах
Похоже проблема с кодировкой. С ГОСТом это вряд ли связано.

Попробуйте вызвать метод "reason.ToUnicodeString();" или получить массив через GetBytes (или GetOriginalBytes) и декодировать массив вручную.
Техническую поддержку оказываем тут
Наша база знаний
Offline LONGPDF  
#20 Оставлено : 10 января 2019 г. 14:12:25(UTC)
LONGPDF

Статус: Новичок

Группы: Участники
Зарегистрирован: 02.01.2019(UTC)
Сообщений: 5

Автор: Артём Макаров Перейти к цитате
Похоже проблема с кодировкой. С ГОСТом это вряд ли связано.

Попробуйте вызвать метод "reason.ToUnicodeString();" или получить массив через GetBytes (или GetOriginalBytes) и декодировать массив вручную.


Благодарю!!!
reason.ToUnicodeString() - заработал.
Огромное спасибо!!!
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.