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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline kassfb  
#1 Оставлено : 29 июля 2022 г. 12:50:24(UTC)
kassfb

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

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

Сказал(а) «Спасибо»: 2 раз
Всем привет! Пробую подписать PDF документ встроенной подписью, чтобы было видно кто подписал и время подписи (был видимый штамп).
Установлено: КриптоПро CSP 5.0.1200, КриптоПро PDF 2.0, Acrobat Reader DC x32, КриптоПро Browser plug-in,
Для этого на сервере (.Net Core 3.1) создаю тестовый PDF и с помощью пакета iTextSharp (v. 5.5.13.3) добавляю туда пустой контейнер для подписи, сохраняю неподписанный pdf с пустым контейнером для подписи [unsignedPdfWithSignatureContainer] и отправляю на клиент массив байт [bytesToSign] для получения отсоединенной подписи:

byte[] sourcePdf = PdfSignerService.CreatePdf();//PdfSignerService - отдельный класс, в котором содержатся методы для подписи пдф
byte[] bytesToSign = PdfSignerService.GetPdfAndBytesToSign(sourcePdf, signatureFieldName, out byte[] unsignedPdfWithSignatureContainer);

Создание PDF и добавление контейнера для подписи:

На клиенте (Angular (TypeScript)) с помощью плагина и npm-пакета crypto-pro 2.3.0, выбираю сертификат которым буду подписывать, тип подписи-отсоединенная, считаю хеш переданного сообщения и подписываю вычисленный хеш и отправляю подпись на сервер
Код создания отсоединенной подписи на клиенте:

Когда сервер получает от клиента его подпись [signature], конвертирую её из base64 в массив байт [bytesSignature] и добавляю в подготовленный ранее неподписанный pdf с контейнером для подписи:

byte[] bytesSignature = Convert.FromBase64String(signature);
var signedPdf = PdfSignerService.GetSignedPdf(unsignedPdfWithSignatureContainer, bytesSignature);
Метод "встраивания" подписи в PDF документ:

В конце концов отправляю подписанный PDF на клиент и там сохраняю.

Проблема в том, что когда я открываю этот документ, на нем видно место с подписью, но не указано кто его подписал, а при нажатии на подпись Adobe Reader DC выдает следующее: Error during signature verification. Error encountered while validating: Unsupported algorithm.

Прикрепляю полученный PDF:
[Signed] Ehlektronnyjj zhurnal za Thu Jul 28 2022 00_00_00 GMT+0300 (Moscow Standard Time).pdf (132kb) загружен 14 раз(а).

Подскажите, пожалуйста, в чем может быть проблема? Я подозреваю, что подписывается/передается что-то не то. Я пробою передавать массив байт [bytesToSign], но на клиенте он автоматически конвертируется в base64 строку. В каком формате должно быть передаваемое сообщение на клиент для вычисления хеша?
Offline Андрей *  
#2 Оставлено : 29 июля 2022 г. 12:59:49(UTC)
Андрей *

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

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

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

0. Код не смотрел. Но "рисовать" текст необходимо самостоятельно, с нужным текстом (на форуме поискать, были примеры)
1. Unsupported algorithm - потому что необходимо настроить Reader на КриптоПРО PDF для проверки ЭП
2. Подпись некорректная...

Snimok ehkrana ot 2022-07-29 13-55-47.png (25kb) загружен 30 раз(а).
Snimok ehkrana ot 2022-07-29 13-58-47.png (28kb) загружен 20 раз(а).
Техническую поддержку оказываем тут
Наша база знаний
Offline kassfb  
#3 Оставлено : 29 июля 2022 г. 13:50:34(UTC)
kassfb

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

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

Сказал(а) «Спасибо»: 2 раз
Подскажите, в какой программе вы проверяли документ (первое фото), где написано "ошибка неправильное значение хеша"?

UPD. Программа CryptExpert

Отредактировано пользователем 29 июля 2022 г. 14:04:28(UTC)  | Причина: Не указана

Offline kassfb  
#4 Оставлено : 3 августа 2022 г. 20:37:19(UTC)
kassfb

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

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

Сказал(а) «Спасибо»: 2 раз
Андрей, спасибо за ответ. В Adobe Reader DC в настройках выбрана проверка подписей с помощью КриптоПро PDF. Видел на форуме была тема с похожей проблемой, там невалидность подписи действительно решилась настройкой проверки подписей в Adobe, но не в моем случае...
Кроме этого, видел похожие темы с встраиванием подписи на Java, там так же использовали iText (iTextSharp аналог для C#) и там говорилось о пропатченной версии этой библиотеки. (Ссылка на тему с форума:https://www.cryptopro.ru/forum2/...aspx?g=posts&t=17999) Для dotNet я упоминаний что что-то нужно патчить не видел. Поэтому хотелось бы уточнить этот момент. Нужно ли патчить iTextSharp (v. 5.5.13.3) чтобы добавить встроенную подпись в pdf?

Но больше всего волнует вопрос неправильного значения хеша, который я считаю на клиенте и сразу после получаю отсоединенную подпись.
Вот код вычисления хеша:
Код:
export const createHash = _afterPluginsLoaded(
  async (unencryptedMessage: string | ArrayBuffer): Promise<string> => {
    const { cadesplugin } = window;

    return eval(
      _generateCadesFn(function createHash(): string {
        const cadesHashedData = __cadesAsyncToken__ + __createCadesPluginObject__('CAdESCOM.HashedData');
        let messageBase64;
        let hash;

        try {
          messageBase64 = Buffer.from(unencryptedMessage).toString('base64');
        } catch (error) {
          console.error(error);

          throw new Error('Ошибка при преобразовании сообщения в Base64');
        }

        try {
          void (
            __cadesAsyncToken__ +
            cadesHashedData.propset_Algorithm(cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256)
          );
          void (__cadesAsyncToken__ + cadesHashedData.propset_DataEncoding(cadesplugin.CADESCOM_BASE64_TO_BINARY));
          void (__cadesAsyncToken__ + cadesHashedData.Hash(messageBase64));
        } catch (error) {
          console.error(error);

          throw new Error(_extractMeaningfulErrorMessage(error) || 'Ошибка при инициализации хэширования');
        }

        try {
          hash = __cadesAsyncToken__ + cadesHashedData.Value;
        } catch (error) {
          console.error(error);

          throw new Error(_extractMeaningfulErrorMessage(error) || 'Ошибка при создании хэша');
        }

        return hash;
      }),
    );
  },
);


Вот так выглядит подпись когда я отправляю её с клиента на сервер, чтобы там встроить в PDF:

Подскажите, пожалуйста, в чем может быть проблема с неправильным значением хеша и, как следствие, недействительности подписи?

invalid signature.png (56kb) загружен 16 раз(а).
Offline Андрей *  
#5 Оставлено : 3 августа 2022 г. 23:46:30(UTC)
Андрей *

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

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

Сказал «Спасибо»: 618 раз
Поблагодарили: 2389 раз в 1880 постах
Предлагаю самое простое - подписывать бинарный файл (к примеру, jpg) и проверять валидность отсоединенной подписи.
Как только она будет корректной - смотреть, как формируете массив для хеширования из PDF.

Отредактировано пользователем 3 августа 2022 г. 23:48:22(UTC)  | Причина: Не указана

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