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

Уведомление

Icon
Error

3 Страницы<123>
Опции
К последнему сообщению К первому непрочитанному
Offline Павел_К  
#11 Оставлено : 23 мая 2018 г. 8:29:22(UTC)
Павел_К

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

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

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

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

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

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

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

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


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

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

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

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 54 раз в 53 постах
Получение LOCATION и REASON

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

PdfString location = singleSignature.GetAsString(PdfName.LOCATION);
PdfString reason = singleSignature.GetAsString(PdfName.REASON); 
Техническую поддержку оказываем тут
Наша база знаний
Offline LONGPDF  
#14 Оставлено : 10 января 2019 г. 16: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 г. 16:23:10(UTC)
Артём Макаров

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

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

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 54 раз в 53 постах
Кто "она"? Что значит "Раскодировать как для сертификата"?

Какой метод не отрабатывает? Ошибка в signedCms.Decode?
Техническую поддержку оказываем тут
Наша база знаний
Offline LONGPDF  
#16 Оставлено : 10 января 2019 г. 16: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 г. 16:43:54(UTC)
Артём Макаров

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

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

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 54 раз в 53 постах
Вы пытаетесь проверить строку, содержащую 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 г. 16:59:46(UTC)
LONGPDF

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

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

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

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

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

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

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 54 раз в 53 постах
Похоже проблема с кодировкой. С ГОСТом это вряд ли связано.

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

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

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

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

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


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