Статус: Участник
Группы: Участники
Зарегистрирован: 01.08.2024(UTC) Сообщений: 20  Сказал(а) «Спасибо»: 6 раз
|
Добрый день!
Подскажите, возможно ли реализовать подписание данных в формате Base64Url средствами cadesplugin и какие функции и преобразования для этого необходимо использовать?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,607   Сказал «Спасибо»: 565 раз Поблагодарили: 2282 раз в 1784 постах
|
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 01.08.2024(UTC) Сообщений: 20  Сказал(а) «Спасибо»: 6 раз
|
Автор: Андрей *  Здравствуйте. Пробовала данные примеры. Банк не принимает подписи в таком формате. Согласно 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
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,607   Сказал «Спасибо»: 565 раз Поблагодарили: 2282 раз в 1784 постах
|
И зачем эти сложности с хешированием? Если есть исходные данные и они малого объема. В примере демо-страницы формируется не -detached т.е. достаточно посмотреть код, скопировать js и подправить параметр на -detached тип. пример: plugin-samples-sign-detached |
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,607   Сказал «Спасибо»: 565 раз Поблагодарили: 2282 раз в 1784 постах
|
Автор: katerinoc  Но такой способ не работает. Так и пишет? "Не работаю"? И примеров что было и что получилось - тоже нет? после sign - есть base64 значение отсоединенной ЭП, её и смотреть, (де)кодировать, приводить в соответствие к base64url. Т.е. тут вопрос не к плагину\СКЗИ, а к исходным на вход и итоговым данным перед отправкой в API. p.s. и тут был уже случай, когда всё корректно (обмен с плагином), а запрос к API системы был некорректно закодирован. |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 01.08.2024(UTC) Сообщений: 20  Сказал(а) «Спасибо»: 6 раз
|
Автор: Андрей *  И зачем эти сложности с хешированием? Если есть исходные данные и они малого объема. В примере демо-страницы формируется не -detached т.е. достаточно посмотреть код, скопировать js и подправить параметр на -detached тип. пример: plugin-samples-sign-detached Для других банков данный алгоритм я реализовала и все работает отлично. Но в некоторых апи требование - base64url и алгоритм хэширования. Иначе подпись не проходит проверку на стороне банка. Пробовала подписывать такие же данные на демо странице - такая подпись также не принимается банком.
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 01.08.2024(UTC) Сообщений: 20  Сказал(а) «Спасибо»: 6 раз
|
Автор: Андрей *  Автор: katerinoc  Но такой способ не работает. Так и пишет? "Не работаю"? И примеров что было и что получилось - тоже нет? после sign - есть base64 значение отсоединенной ЭП, её и смотреть, (де)кодировать, приводить в соответствие к base64url. Т.е. тут вопрос не к плагину\СКЗИ, а к исходным на вход и итоговым данным перед отправкой в API. p.s. и тут был уже случай, когда всё корректно (обмен с плагином), а запрос к API системы был некорректно закодирован. То есть можно попробовать такое: Мне на вход приходят данные в формате base64url Эти данные я сначала хэширую нужным алгоритмом (реализация из первого сообщения подходит?) Затем подписываю Получаю подпись в формате base64 Данную подпись мне нужно привести в формат base64url? На сколько такая реализация не будет противоречить апи: base64url(sign(base64url(UTF-8(json)))) ?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 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 разница:
Цитата: Index Base64 Base64Url
0 A A 1 B B 2 C C 3 D D 4 E E 5 F F 6 G G 7 H H 8 I I 9 J J 10 K K 11 L L 12 M M 13 N N 14 O O 15 P P 16 Q Q 17 R R 18 S S 19 T T 20 U U 21 V V 22 W W 23 X X 24 Y Y 25 Z Z 26 a a 27 b b 28 c c 29 d d 30 e e 31 f f 32 g g 33 h h 34 i i 35 j j 36 k k 37 l l 38 m m 39 n n 40 o o 41 p p 42 q q 43 r r 44 s s 45 t t 46 u u 47 v v 48 w w 49 x x 50 y y 51 z z 52 0 0 53 1 1 54 2 2 55 3 3 56 4 4 57 5 5 58 6 6 59 7 7 60 8 8 61 9 9 62 + - 63 / _ = (optional)
|
|
 1 пользователь поблагодарил Андрей * за этот пост.
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,607   Сказал «Спасибо»: 565 раз Поблагодарили: 2282 раз в 1784 постах
|
примера исходного json и ЭП в api нет? |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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 разница:
Цитата: Index Base64 Base64Url
0 A A 1 B B 2 C C 3 D D 4 E E 5 F F 6 G G 7 H H 8 I I 9 J J 10 K K 11 L L 12 M M 13 N N 14 O O 15 P P 16 Q Q 17 R R 18 S S 19 T T 20 U U 21 V V 22 W W 23 X X 24 Y Y 25 Z Z 26 a a 27 b b 28 c c 29 d d 30 e e 31 f f 32 g g 33 h h 34 i i 35 j j 36 k k 37 l l 38 m m 39 n n 40 o o 41 p p 42 q q 43 r r 44 s s 45 t t 46 u u 47 v v 48 w w 49 x x 50 y y 51 z z 52 0 0 53 1 1 54 2 2 55 3 3 56 4 4 57 5 5 58 6 6 59 7 7 60 8 8 61 9 9 62 + - 63 / _ = (optional)
Попробовала Код теперь выглядит так (преобразование подписи находится в другом сервисе): Цитата: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; } Такое решение также не помогло
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close