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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline admin@uprio.ru  
#1 Оставлено : 8 июля 2020 г. 15:09:04(UTC)
admin@uprio.ru

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

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

Здравствуйте. Суть вопроса в следующем. Каким образом можно расшифровать элемент SignatureValue из XML запроса для СМЭВ имея открытую часть сертификата и само значение SignatureValue.
Sign.txt (1kb) загружен 14 раз(а).
Cert.txt (3kb) загружен 14 раз(а).
Offline Андрей *  
#2 Оставлено : 8 июля 2020 г. 15:30:18(UTC)
Андрей *

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

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

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

Это RAW-подпись.
Необходимо получить тот же XML (или файл), под которым вычислялся хеш.
Далее проверять подпись соответствующими языку программирования функциями.


На MS CryptoAPI это сценарий такой:
CryptAcquireContext(Prov... CRYPT_VERIFYCONTEXT)
CryptImportPublicKeyInfoEx (сертификат... &key)
CryptCreateHash(Prov...
CryptHashData(Hash, Memory, Size..)
CryptVerifySignature(Hash, Memory, Size, hKey..
Техническую поддержку оказываем тут
Наша база знаний
Offline admin@uprio.ru  
#3 Оставлено : 8 июля 2020 г. 15:41:20(UTC)
admin@uprio.ru

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

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

Автор: Андрей * Перейти к цитате
Здравствуйте.

Это RAW-подпись.
Необходимо получить тот же XML (или файл), под которым вычислялся хеш.
Далее проверять подпись соответствующими языку программирования функциями.


Это я знаю. Поэтому и спрашиваю как сделать следующее.

Вырезка из переписки с минсвязью.
Цитата:

Проверка подписи происходит следующим образом:
- в СМЭВ поступает запрос;
- канонизируется элемент SignedInfo с помощью алгоритма c14n;
- далее расшифровывается SignatureValue с помощью открытого ключа сертификата – x1;
- берется SignedInfo и считается от него хэш – x2, если x1 не равен x2, СМЭВ возвращает ошибку «Неверная ЭП сообщения. Если же х1 = х2, то проверка переходит на следующий шаг;
- считается хэш от body запроса – y1 по методу указанному в DigestMethod. Из DigestValue получаем – y2. Если y1 не равен y2, то СМЭВ возвращает ошибку "Неверная ЭП сообщения".


Хочу разобраться, где я неправильно подписываю.
Offline Андрей *  
#4 Оставлено : 8 июля 2020 г. 15:50:47(UTC)
Андрей *

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

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

Сказал «Спасибо»: 494 раз
Поблагодарили: 2034 раз в 1578 постах
Цитата:
канонизируется элемент SignedInfo с помощью алгоритма c14n

Думаю вот здесь проблема.
Пока будете по-разному "получать" - будет хеш другой, проверка не будет проходить.

Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#5 Оставлено : 8 июля 2020 г. 15:53:52(UTC)
Андрей *

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

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

Сказал «Спасибо»: 494 раз
Поблагодарили: 2034 раз в 1578 постах
Начните с самовалидации... примеры с корректной подписью от СМЭВ помогут - сделайте проверку подписи.
Как только будете проходить этот пункт - будет правильно и подписываться.
Техническую поддержку оказываем тут
Наша база знаний
Offline admin@uprio.ru  
#6 Оставлено : 8 июля 2020 г. 16:05:33(UTC)
admin@uprio.ru

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

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

У меня есть валидный запрос Zapros.xml (9kb) загружен 16 раз(а)., который проходит проверку.
Расчет HASH от узла BODY у меня получается такой же, как и в этом запросе (после канонизации). Непонятно с узлом SIGNEDINFO, ведь подписывается хэш от этого узла после канонизации. Вот я и хочу узнать хэш от signedinfo, чтобы понимать что я делаю не так. Или я что-то не до понимаю...
Offline two_oceans  
#7 Оставлено : 23 июля 2020 г. 6:14:27(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 393 раз в 366 постах
Добрый день. Я вернулся, так что можете по подписи XML адресовать вопросы мне - тоже долго бился со своей программой, теперь помогаю коллегам с этой бедой.
Автор: admin@uprio.ru Перейти к цитате
Вырезка из переписки с минсвязью.
Цитата:
...
- далее расшифровывается SignatureValue с помощью открытого ключа сертификата – x1;
- берется SignedInfo и считается от него хэш – x2, ...
Хочу разобраться, где я неправильно подписываю.
Эта цитата верна в случае зарубежных алгоритмов, однако применительно к гост и СМЭВ Вас того... обманули, короче. Поясняю:
SignatureValue для гост состоит из двух равных частей. Одна часть - проверочное значение получаемое после неких (описанных собственно в гост-2012) манипуляций с хэшем, закрытым ключом и случайным значением (проверочное значение берется за x1), вторая часть - само случайное значение (для вычисления x2). В отличие от шифрования которое теоретически можно обратить (расшифровать), в госте нет описания как обратить манипуляции гост-2012 и получить хэш. Зато есть описание как получить то же проверочное значение из хэша, открытого ключа и известного случайного значения. Поэтому при проверке подписи гост не восстанавливается значение хэша, а вычисляется проверочное значение с участием открытого ключа сертификата и именно оно берется за x2.

Это доставляет немало неудобств с отладкой подписи XML, так как приходится методом тыка подбирать от какого же преобразования текста сойдется хэш и подпись.
Offline admin@uprio.ru  
#8 Оставлено : 23 июля 2020 г. 12:26:31(UTC)
admin@uprio.ru

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

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

Автор: two_oceans Перейти к цитате
Добрый день. Я вернулся, так что можете по подписи XML адресовать вопросы мне - тоже долго бился со своей программой, теперь помогаю коллегам с этой бедой.

:) можете рассказать алгоритм действий?

Автор: two_oceans Перейти к цитате
Это доставляет немало неудобств с отладкой подписи XML, так как приходится методом тыка подбирать от какого же преобразования текста сойдется хэш и подпись.

т.е. хотите сказать, что надо смотреть в сторону каноникализации?

Offline two_oceans  
#9 Оставлено : 24 июля 2020 г. 5:03:50(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 393 раз в 366 постах
Автор: admin@uprio.ru Перейти к цитате
:) можете рассказать алгоритм действий?
Конечно, насколько подробно надо описать? В общих чертах вроде как правильно описали в ответе поддержки СМЭВ. Момент с которым которым обманули происходит внутри криптопровайдера (как "черный ящик" куда закинули открытый ключ, хэш SignedInfo и RAW значение подписи) и на самом деле любая программа, СМЭВ в том числе, получает от криптопровайдера только логический результат x1=x2 или x1!=x2.

Итак, подписание:

Проверка:
Добавлю, что не пугайтесь когда проверяете ответ СМЭВ и получаете результат ЭП-СМЭВ верна, ЭП-ОВ не верна, ЭП-СП верна. Это означает, что версия пространств имен у Вас и отвечающего разная и СМЭВ сделала медвежью услугу преобразовав ответ к Вашей версии и нарушила этим ЭП-ОВ. Для значимости ответа нужно восстановить версию отвечающего. Или сразу запрашивать по той же версии.
Автор: admin@uprio.ru Перейти к цитате
т.е. хотите сказать, что надо смотреть в сторону каноникализации?
Как правило да. Если вызываете штатные функции сертифицированного криптопровайдера и указываете правильно все алгоритмы (предопределенные константы должны быть с 2012 в названии), то с самим вычислением значения подписи и хэша проблем не должно быть. Остаются 3 важных момента:
1) соблюдать аккуратность и порядок действий чтобы не нарушить готовую верную подпись при вставке в документ. Например, если вырезали фрагмент из документа для каноникализации, важно перенести в него вышестоящие объявления пространств имен перед каноникализацией иначе каноническая форма вырезанного фрагмента будет отличаться от канонической формы этого же фрагмента в документе и при вставке подписи в документ получится неверная подпись. Штатные средства работы с XML должны это сделать автоматически, а вот если копируете документ как строку, то придется вручную добавлять. Если тег без префикса каноникализация даже не ругнется, что пространства имен нет.
2) каноникализация текста что подается в криптопровайдер (да, тут немало сюрпризов и мелких отличий от стандарта. В одной из тем экспериментами дошли до того что СМЭВ исключает символы с кодом 13 в значениях атрибутов даже в форме 
 коды 9 и 10 	 
 заменяются на пробел, при этом если получается несколько пробелов подряд они не заменяются на один пробел);
3) порядок байт значений из криптопровайдера (криптопровайдер криптопро возвращает в Little Endian, а стандарт требует Big Endian), тут надо оговориться что некоторые среды программирования и промежуточные программные "прокладки" уже учитывают это и переворачивать не надо. Однако другие не учитывают и приходится отзеркалить значение как массив байтов (первый байт меняется местами с последним, второй с предпоследним и т.д.)

Отредактировано пользователем 24 июля 2020 г. 5:04:55(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил two_oceans за этот пост.
Санчир Момолдаев оставлено 24.07.2020(UTC)
Offline admin@uprio.ru  
#10 Оставлено : 28 июля 2020 г. 16:52:45(UTC)
admin@uprio.ru

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

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

Спасибо за столь исчерпывающий ответ.
А можно "на пальцах"? У Вас получается сформировать подписанный запрос по ГОСТу 2012? Я пока не берусь делать проверку подписи, т.к. не могу корректно сформировать подпись. Хэш от элемента BODY я помещаю в DigestValue элемента SignedInfo, затем рассчитываю хэш от SignedInfo и подписываю его. Или я неправильно рассчитываю хэш, или неправильно подписываю.
Вот, что у меня получается Charge_20200728-2020-0000-0184-30544B43564A.zip (4kb) загружен 15 раз(а).
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.