Статус: Новичок
Группы: Участники
Зарегистрирован: 22.11.2024(UTC) Сообщений: 5
Сказал(а) «Спасибо»: 1 раз
|
Всем привет)
Существует ли возможность получить с помощью браузерного плагина обычную откреплённую подпись по хэшу файла? (алгоритм хэширования вроде должен совпадать с алгоритмом из сертификата, да?) Причём подпись должна быть такая, что для её валидации требуется именно исходный файл, а не его хэш.
(как раз пример, где для валидации требуется хэш, я вполне себе нашёл, как и пример, где подписывается не хэш, а содержимое файла в формате base64-строки)
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,684   Сказал «Спасибо»: 572 раз Поблагодарили: 2302 раз в 1803 постах
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,684   Сказал «Спасибо»: 572 раз Поблагодарили: 2302 раз в 1803 постах
|
только CADESCOM_HASH_ALGORITHM_CP_GOST_3411 подправить на CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256 cadescom_hash_algorithm |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 22.11.2024(UTC) Сообщений: 5
Сказал(а) «Спасибо»: 1 раз
|
Автор: Андрей *  Извиняюсь, а можете докинуть пример, как теперь результат работы этой функции подписать? Хотя бы ключевые моменты. Потому что я пробовал два варианта: 1. Через SignCades(по мотивам примеров в вашей базе знаний): Цитата:
// Создаем объект CAdESCOM.HashedData var oHashedData = yield cadesplugin.CreateObjectAsync("CAdESCOM.HashedData");
// Алгоритм хэширования нужно указать до того, как будут переданы данные yield oHashedData.propset_Algorithm(cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256);
// Указываем кодировку данных // Кодировка должна быть указана до того, как будут переданы сами данные yield oHashedData.propset_DataEncoding(cadesplugin.CADESCOM_BASE64_TO_BINARY);
// Предварительно закодированные в BASE64 бинарные данные // В данном случае закодирован файл со строкой "Some Data." var dataInBase64 = "U29tZSBEYXRhLg==";
// Передаем данные yield oHashedData.Hash(dataInBase64);
// Получаем хэш-значение var sHashValue = yield oHashedData.Value; const oStore = yield cadesplugin.CreateObjectAsync('CAdESCOM.Store'); yield oStore.Open();
const oCertificates = yield oStore.Certificates; const oCertificate = yield oCertificates.Item(5); // получаю нужный мне сертификат const oSigner = yield cadesplugin.CreateObjectAsync('CAdESCOM.CPSigner'); yield oSigner.propset_Certificate(oCertificate); yield oSigner.propset_CheckCertificate(true);
const oSignedData = yield cadesplugin.CreateObjectAsync('CAdESCOM.CadesSignedData'); yield oSignedData.propset_ContentEncoding(cadesplugin.CADESCOM_BASE64_TO_BINARY); yield oSignedData.propset_Content(sHashValue);
let sSignedMessage = ''; try { sSignedMessage = yield oSignedData.SignCades(oSigner, cadesplugin.CADESCOM_CADES_BES, true); } catch (err) { const e = cadesplugin.getLastError(err); console.log('Failed to create signature. Error: ' + e); }
yield oStore.Close(); return console.log(`sign: ${sSignedMessage}`);
Результат: результирующая строка визуально подходит под нужный формат, но валидация подписи на гос.услугах выдаёт сообщение о том, что подпись невалидна. В принципе у меня есть впечатление, что в этом случае я подписал как бы файл, где в качестве содержимого не исходные данные, а хэш от них. 2. Пробовал через подписывание хэша(опять же из ваших примеров): Цитата:
const oStore = yield cadesplugin.CreateObjectAsync('CAdESCOM.Store'); yield oStore.Open(); const oCertificates = yield oStore.Certificates; const oCertificate = yield oCertificates.Item(5);123456
// Создаем объект CAdESCOM.HashedData var oHashedData = yield cadesplugin.CreateObjectAsync("CAdESCOM.HashedData");
// Алгоритм хэширования нужно указать до того, как будут переданы данные yield oHashedData.propset_Algorithm(cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256);
// Указываем кодировку данных // Кодировка должна быть указана до того, как будут переданы сами данные yield oHashedData.propset_DataEncoding(cadesplugin.CADESCOM_BASE64_TO_BINARY);
// Предварительно закодированные в BASE64 бинарные данные // В данном случае закодирован файл со строкой "Some Data." var dataInBase64 = "U29tZSBEYXRhLg==";
// Передаем данные yield oHashedData.Hash(dataInBase64);
// Получаем хэш-значение var sHashValue = yield oHashedData.Value; // Создаем объект CAdESCOM.RawSignature const oRawSignature = yield cadesplugin.CreateObjectAsync('CAdESCOM.RawSignature');
// Вычисляем значение подписи
const sRawSignature = yield oRawSignature.SignHash(oHashedData, oCertificate); console.log(sRawSignature);
Результат: ожидаемо получаю подпись, для валидации которой требуется хэш файла. Я что-то явно делаю не так) Повторюсь, мне нужно передать на вход хэш и получить на выходе стандартную подпись, которая проверяется без хэша файла. Отредактировано пользователем 17 декабря 2024 г. 8:50:57(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,684   Сказал «Спасибо»: 572 раз Поблагодарили: 2302 раз в 1803 постах
|
что было в варианте 1? какая ошибка? В Инструментах КриптоПро тоже выдалась ошибка? Цитата:// В данном случае закодирован файл со строкой "Some Data." var dataInBase64 = "U29tZSBEYXRhLg=="; что проверялось? Some Data. в файле - 10 байт? или там еще и пару байт лишних? |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 22.11.2024(UTC) Сообщений: 5
Сказал(а) «Спасибо»: 1 раз
|
Автор: Андрей *  что было в варианте 1? какая ошибка? В Инструментах КриптоПро тоже выдалась ошибка? Цитата:// В данном случае закодирован файл со строкой "Some Data." var dataInBase64 = "U29tZSBEYXRhLg=="; что проверялось? Some Data. в файле - 10 байт? или там еще и пару байт лишних? да, в файле 10 байт, только текст из примера. гос.услуги выдают: Цитата:Подпись 1 Статус ЭП Электронная подпись неверна
Статус сертификата ЭП Не проверялся
Владелец сертификата C=RU, ST=тест, L=тест, O=тест, OU=тест, CN=тест2 тест2 тес3 тест4 тест5, E=xn--e1aybc
Издатель сертификата CN=CRYPTO-PRO Test Center 2, O=CRYPTO-PRO LLC, L=Moscow, C=RU, E=support@cryptopro.ru
Серийный номер 120066858774222B74522BE38C000200668587
Отпечаток 8B15D6AEAB671D480E11E1A78C91716D569FB3AD
Действует с 20.11.2024 по 20.01.2025 Ну там же, гос.услугах, подпись нормально проходит проверку, если таким образом подписать не хэш, а сам текст. Инструменты криптоПро выдают такое: Цитата: Подпись 1/1: Ошибка при проверке (0x80091007: Неправильное значение хеша.) Статус проверки: Сообщение содержит неверную подпись. Тип подписи: CAdES-BES Cубъект: E=xn--e1aybc, CN=тест2 тест2 тес3 тест4 тест5, OU=тест, O=тест, L=тест, S=тест, C=RU Отпечаток: 8B15D6AEAB671D480E11E1A78C91716D569FB3AD Время подписания: 17/12/2024 05:27:58 UTC Цепочка: CRYPTO-PRO Test Center 2 → тест2 тест2 тес3 тест4 тест5
А у вас нет какого-нибудь цельного примера, который бы работал хотя бы на вашей машине? Отредактировано пользователем 17 декабря 2024 г. 14:38:19(UTC)
| Причина: Не указана
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 22.11.2024(UTC) Сообщений: 5
Сказал(а) «Спасибо»: 1 раз
|
Автор: Андрей *  что было в варианте 1? какая ошибка? В Инструментах КриптоПро тоже выдалась ошибка? Цитата:// В данном случае закодирован файл со строкой "Some Data." var dataInBase64 = "U29tZSBEYXRhLg=="; что проверялось? Some Data. в файле - 10 байт? или там еще и пару байт лишних? Ну и вообще во всех примерах про подпись хэша верификация тоже происходит по хэшу, тогда как должна была бы происходить по исходной строке base64(если всё же можно обойтись без хеша при валидации). Точно ли это возможно сделать с помощью плагина? Может эта функция доступна только из SDK на бэке? Вроде где-то на форуме видел примеры для C#, в которых специальный флажок использовался при создании подписи, чтобы сказать, что подписывается уже хэш и его дополнительно хэшировать не нужно. Тогда как для плагина ничего похожего найти не могу.
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close