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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline katerinoc  
#1 Оставлено : 25 февраля 2025 г. 11:24:43(UTC)
katerinoc

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

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

Сказал(а) «Спасибо»: 6 раз
Добрый день!

Подскажите, возможно ли реализовать подписание данных в формате Base64Url средствами cadesplugin и какие функции и преобразования для этого необходимо использовать?
Offline Андрей *  
#2 Оставлено : 25 февраля 2025 г. 11:51:40(UTC)
Андрей *

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

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

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

строку здесь: demopage/cades_bes_sample


другие примеры:
plugin-samples


Техническую поддержку оказываем тут
Наша база знаний
Offline katerinoc  
#3 Оставлено : 25 февраля 2025 г. 12:54:56(UTC)
katerinoc

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

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

Сказал(а) «Спасибо»: 6 раз
Автор: Андрей * Перейти к цитате
Здравствуйте.

строку здесь: demopage/cades_bes_sample


другие примеры:
plugin-samples




Здравствуйте.
Пробовала данные примеры.
Банк не принимает подписи в таком формате.
Согласно api банка требуется такой формат:
signature = base64url(sign(base64url(UTF-8(json)))) включая x.509 сертификат

При этом нужен также алгоритм хэширования CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256.

Использую функцию SignHash, предвраительно формирую хэш своих данных для подписания.
Но такой способ не работает.
Вот часть реализации:
Цитата:
var oHashedData = yield cadesplugin.CreateObjectAsync("CAdESCOM.HashedData");
// Алгоритм хэширования нужно указать до того, как будут переданы данные
yield oHashedData.propset_Algorithm(cadesplugin[hashAlg]);

var dataInBase64 = yield data.substr(1);
// Передаем данные
yield oHashedData.Hash(dataInBase64);

yield window.oSigner.propset_Options(cadesplugin.CAPICOM_CERTIFICATE_INCLUDE_END_ENTITY_ONLY);

var sSignedMessage = "";
try {
sSignedMessage = yield oSignedData.SignHash(oHashedData, window.oSigner, cadesplugin.CADESCOM_CADES_BES);
} catch (err) {
window.e = 1;//"Ошибка при создании подписи: " + cadesplugin.getLastError(err);
window.err = cadesplugin.getLastError(err);
return e;
}
}



через командную строку параметры выглядят так: -nochain -cert -detached -hashAlg 1.2.643.7.1.1.2.2
Offline Андрей *  
#4 Оставлено : 25 февраля 2025 г. 13:48:53(UTC)
Андрей *

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

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

Сказал «Спасибо»: 565 раз
Поблагодарили: 2282 раз в 1784 постах
И зачем эти сложности с хешированием?
Если есть исходные данные и они малого объема.

В примере демо-страницы формируется не -detached
т.е. достаточно посмотреть код, скопировать js и подправить параметр на -detached тип.

пример:
plugin-samples-sign-detached
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#5 Оставлено : 25 февраля 2025 г. 13:55:47(UTC)
Андрей *

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

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

Сказал «Спасибо»: 565 раз
Поблагодарили: 2282 раз в 1784 постах
Автор: katerinoc Перейти к цитате

Но такой способ не работает.


Так и пишет? "Не работаю"?
И примеров что было и что получилось - тоже нет?

после sign - есть base64 значение отсоединенной ЭП, её и смотреть, (де)кодировать, приводить в соответствие к base64url.

Т.е. тут вопрос не к плагину\СКЗИ, а к исходным на вход и итоговым данным перед отправкой в API.

p.s.
и тут был уже случай, когда всё корректно (обмен с плагином),
а запрос к API системы был некорректно закодирован.
Техническую поддержку оказываем тут
Наша база знаний
Offline katerinoc  
#6 Оставлено : 25 февраля 2025 г. 13:55:53(UTC)
katerinoc

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

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

Сказал(а) «Спасибо»: 6 раз
Автор: Андрей * Перейти к цитате
И зачем эти сложности с хешированием?
Если есть исходные данные и они малого объема.

В примере демо-страницы формируется не -detached
т.е. достаточно посмотреть код, скопировать js и подправить параметр на -detached тип.

пример:
plugin-samples-sign-detached



Для других банков данный алгоритм я реализовала и все работает отлично.
Но в некоторых апи требование - base64url и алгоритм хэширования. Иначе подпись не проходит проверку на стороне банка.
Пробовала подписывать такие же данные на демо странице - такая подпись также не принимается банком.
Offline katerinoc  
#7 Оставлено : 25 февраля 2025 г. 14:01:50(UTC)
katerinoc

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

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

Сказал(а) «Спасибо»: 6 раз
Автор: Андрей * Перейти к цитате
Автор: katerinoc Перейти к цитате

Но такой способ не работает.


Так и пишет? "Не работаю"?
И примеров что было и что получилось - тоже нет?

после sign - есть base64 значение отсоединенной ЭП, её и смотреть, (де)кодировать, приводить в соответствие к base64url.

Т.е. тут вопрос не к плагину\СКЗИ, а к исходным на вход и итоговым данным перед отправкой в API.

p.s.
и тут был уже случай, когда всё корректно (обмен с плагином),
а запрос к API системы был некорректно закодирован.



То есть можно попробовать такое:
Мне на вход приходят данные в формате base64url
Эти данные я сначала хэширую нужным алгоритмом (реализация из первого сообщения подходит?)
Затем подписываю
Получаю подпись в формате base64
Данную подпись мне нужно привести в формат base64url?

На сколько такая реализация не будет противоречить апи: base64url(sign(base64url(UTF-8(json)))) ?
Offline Андрей *  
#8 Оставлено : 25 февраля 2025 г. 14:44:30(UTC)
Андрей *

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

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

Сказал «Спасибо»: 565 раз
Поблагодарили: 2282 раз в 1784 постах
dataInBase64 = base64(данные),
где данные в данном случае уже подготовленная строка base64url (банк же от base64url хочет ЭП)

далее:
yield oSignedData.propset_ContentEncoding(cadesplugin.CADESCOM_BASE64_TO_BINARY); - обязательно
yield oSignedData.propset_Content(dataInBase64);-- в памяти будет декодировано из base64 и подписано (по сути, то что было в base64url).


Итого - в sSignedMessage получили base64 от бинарной asn.1 структуры,
т.к. base64 <> base64url значит из sSignedMessage декодируем бинарные данные и кодируем в base64url



разница:
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
katerinoc оставлено 25.02.2025(UTC)
Offline Андрей *  
#9 Оставлено : 25 февраля 2025 г. 14:47:47(UTC)
Андрей *

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

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

Сказал «Спасибо»: 565 раз
Поблагодарили: 2282 раз в 1784 постах
примера исходного json и ЭП в api нет?
Техническую поддержку оказываем тут
Наша база знаний
Offline katerinoc  
#10 Оставлено : 25 февраля 2025 г. 15:05:47(UTC)
katerinoc

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

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

Сказал(а) «Спасибо»: 6 раз
Автор: Андрей * Перейти к цитате
dataInBase64 = base64(данные),
где данные в данном случае уже подготовленная строка base64url (банк же от base64url хочет ЭП)

далее:
yield oSignedData.propset_ContentEncoding(cadesplugin.CADESCOM_BASE64_TO_BINARY); - обязательно
yield oSignedData.propset_Content(dataInBase64);-- в памяти будет декодировано из base64 и подписано (по сути, то что было в base64url).


Итого - в sSignedMessage получили base64 от бинарной asn.1 структуры,
т.к. base64 <> base64url значит из sSignedMessage декодируем бинарные данные и кодируем в base64url



разница:


Попробовала
Код теперь выглядит так (преобразование подписи находится в другом сервисе):

Цитата:
var oHashedData = yield cadesplugin.CreateObjectAsync("CAdESCOM.HashedData");
// Алгоритм хэширования нужно указать до того, как будут переданы данные
yield oHashedData.propset_Algorithm(cadesplugin[hashAlg]);

var dataInBase64 = yield self.BASE64URLTOBASE64(data.substr(1));
// Передаем данные
yield oHashedData.Hash(dataInBase64);

yield window.oSigner.propset_Options(cadesplugin.CAPICOM_CERTIFICATE_INCLUDE_END_ENTITY_ONLY);
yield oSignedData.propset_ContentEncoding(cadesplugin.CADESCOM_BASE64_TO_BINARY);
yield oSignedData.propset_Content(dataInBase64);


var sSignedMessage = "";
try {
sSignedMessage = yield oSignedData.SignHash(oHashedData, window.oSigner, cadesplugin.CADESCOM_CADES_BES);
} catch (err) {
console.log('catch2')

window.e = 1;//"Ошибка при создании подписи: " + cadesplugin.getLastError(err);
window.err = cadesplugin.getLastError(err);
return e;
}


Цитата:
BASE64URLTOBASE64(base64url) {
// Заменяем символы
let base64 = base64url
.replace(/-/g, '+') // Заменяем '-' на '+'
.replace(/_/g, '/'); // Заменяем '_' на '/'

// Добавляем символы заполнения
const padding = base64.length % 4;
if (padding > 0) {
base64 += '='.repeat(4 - padding); // Добавляем '=' для выравнивания
}

return base64;
}

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