Статус: Эксперт
Группы: Участники
Зарегистрирован: 05.03.2015(UTC) Сообщений: 1,602 Откуда: Иркутская область Сказал(а) «Спасибо»: 110 раз Поблагодарили: 395 раз в 366 постах
|
Автор: Dmitriy_Zh Служебный данные из трейса SignedXml Преобразованный контент ссылки: У этого фрагмента хэш совпадает с указанным в Reference, но у меня получилось другое значение с хэшем YEwZ+QB5G+8QrPaN1AqOXcyey1ky5dYNNyJX+XFJ+0w=.
Код:<ns1:SenderProvidedRequestData xmlns:ns1="urn://x-artefacts-smev-gov-ru/services/message-exchange/types/1.2" Id="SIGNED_BY_CONSUMER"><ns1:MessageID>64967690-15d9-11ea-9b99-fd81cd2ec424</ns1:MessageID><ns2:MessagePrimaryContent xmlns:ns2="urn://x-artefacts-smev-gov-ru/services/message-exchange/types/basic/1.2"><ns3:SVUIDATRequest xmlns:ns3="urn://x-artefacts-fns-nsvuidat/root/311-31/4.0.1"></ns3:SVUIDATRequest></ns2:MessagePrimaryContent></ns1:SenderProvidedRequestData>
Навскидку отличается тем что сам SenderProvidedRequestData у меня попал под смэвовский трансформ, а в Вашем примере не попал под трансформ. Автор: Dmitriy_Zh Выходные данные преобразования канонизации: SignedInfo совпадает при проверке SignatureValue и с тем что получилось у меня. Автор: Dmitriy_Zh Данные которые сформировал клиент WCF для отправки: Тут вообще невалидный xml - нет объявления префикса для Body (или просто Envelope куда-то делся, хотя вроде не нужны Body с Envelope). В целом, после добавления объявления, SignatureValue сошлось, а DigestValue нет. Отредактировано пользователем 4 декабря 2019 г. 6:07:34(UTC)
| Причина: Не указана
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 25.09.2019(UTC) Сообщений: 14
|
Автор: two_oceans Автор: Dmitriy_Zh Служебный данные из трейса SignedXml Преобразованный контент ссылки: У этого фрагмента хэш совпадает с указанным в Reference, но у меня получилось другое значение с хэшем YEwZ+QB5G+8QrPaN1AqOXcyey1ky5dYNNyJX+XFJ+0w=.
Код:<ns1:SenderProvidedRequestData xmlns:ns1="urn://x-artefacts-smev-gov-ru/services/message-exchange/types/1.2" Id="SIGNED_BY_CONSUMER"><ns1:MessageID>64967690-15d9-11ea-9b99-fd81cd2ec424</ns1:MessageID><ns2:MessagePrimaryContent xmlns:ns2="urn://x-artefacts-smev-gov-ru/services/message-exchange/types/basic/1.2"><ns3:SVUIDATRequest xmlns:ns3="urn://x-artefacts-fns-nsvuidat/root/311-31/4.0.1"></ns3:SVUIDATRequest></ns2:MessagePrimaryContent></ns1:SenderProvidedRequestData>
Навскидку отличается тем что сам SenderProvidedRequestData у меня попал под смэвовский трансформ, а в Вашем примере не попал под трансформ. Автор: Dmitriy_Zh Выходные данные преобразования канонизации: SignedInfo совпадает при проверке SignatureValue и с тем что получилось у меня. Автор: Dmitriy_Zh Данные которые сформировал клиент WCF для отправки: Тут вообще невалидный xml - нет объявления префикса для Body (или просто Envelope куда-то делся, хотя вроде не нужны Body с Envelope). В целом, после добавления объявления, SignatureValue сошлось, а DigestValue нет. Данные от WCF клиента я выбирал из трейса, там есть обёртка Envelope и Body. Просто их не стал добавлять. По поводу трансформации не очень понятно, т.к передаю SenderProvidedRequestData на подпись. Так же не понятно, по какой причине DigestValue может отличаться... Сегодня сделаю формирование запроса в файл, чтобы WCF не влиял на конечный результат. Т.к пока не могу понять на этапе формирования данных ошибка или на этапе отправки данных. По результатам отпишусь.
|
|
|
|
Статус: Эксперт
Группы: Участники
Зарегистрирован: 05.03.2015(UTC) Сообщений: 1,602 Откуда: Иркутская область Сказал(а) «Спасибо»: 110 раз Поблагодарили: 395 раз в 366 постах
|
Автор: Dmitriy_Zh По поводу трансформации не очень понятно, т.к передаю SenderProvidedRequestData на подпись. Так же не понятно, по какой причине DigestValue может отличаться... Хэш в Reference в итоговом файле совпадает с хэшем результата трансформации из SignedXml, то есть похоже после трансформации был верно посчитан хэш (но от другого результата трансформации и потому отличается) и без критических искажений как SignedInfo, так и подписанный фрагмент перешел в итоговый файл. Полагаю, это указывает именно на неправильный трансформ, далее сборка без искажений. Отредактировано пользователем 4 декабря 2019 г. 10:18:08(UTC)
| Причина: P.S. приходится сохранять пустое сообщение и править чтобы форум не вылетал каждые несколько секунд
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 25.09.2019(UTC) Сообщений: 14
|
Автор: two_oceans Автор: Dmitriy_Zh По поводу трансформации не очень понятно, т.к передаю SenderProvidedRequestData на подпись. Так же не понятно, по какой причине DigestValue может отличаться... Хэш в Reference в итоговом файле совпадает с хэшем результата трансформации из SignedXml, то есть похоже после трансформации был верно посчитан хэш (но от другого результата трансформации и потому отличается) и без критических искажений как SignedInfo, так и подписанный фрагмент перешел в итоговый файл. Полагаю, это указывает именно на неправильный трансформ, далее сборка без искажений. Мне удалось добиться прохождения проверки. Для этого полностью отказался от использования сгенерированных классов и написал всё руками. Буду делать свою библиотеку для решения взаимодействия со СМЭВ. Из коробки не работает :(
|
|
|
|
Статус: Эксперт
Группы: Участники
Зарегистрирован: 05.03.2015(UTC) Сообщений: 1,602 Откуда: Иркутская область Сказал(а) «Спасибо»: 110 раз Поблагодарили: 395 раз в 366 постах
|
В этой теме пару страниц назад вроде бы скидывали ссылку на один из проектов.
В целом да, вручную наше все, я в другой среде, но тоже пишу сам - сейчас вот думаю свой генератор сделать, чтобы не выписывать для каждой схемы элементы вручную. Один раз прочитать схему, сделать дамп в своем формате и по нему работать.
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 25.09.2019(UTC) Сообщений: 14
|
Автор: two_oceans В этой теме пару страниц назад вроде бы скидывали ссылку на один из проектов.
В целом да, вручную наше все, я в другой среде, но тоже пишу сам - сейчас вот думаю свой генератор сделать, чтобы не выписывать для каждой схемы элементы вручную. Один раз прочитать схему, сделать дамп в своем формате и по нему работать. У меня получилось выполнить в итоге эталонные запросы. Тестовый проект смотрел))) Но он реализован очень запутанно. Я для наших проектов буду делать библиотеку свою. Самое сложное - подписать данные в правильном виде. Сейчас сделал это с помощью костылей. Хочу в ближайшие дни заставить работать автосгенерированный код
|
|
|
|
Статус: Эксперт
Группы: Участники
Зарегистрирован: 05.03.2015(UTC) Сообщений: 1,602 Откуда: Иркутская область Сказал(а) «Спасибо»: 110 раз Поблагодарили: 395 раз в 366 постах
|
Полагаю в моем коде тоже легко запутаться, не всегда простая и легкая мысль приходит сразу. Приходится все рефакторить под новую идею, стараясь не нарушить функциональность. Сейчас вот пришел к казалось бы очевидной идее сымитировать коллекции и индексы. Вчера попробовал написать программу собирающую все инклюды в единый файл. Для ифдеф стек, для дефайнов массив+индекс. Ночь и все утро просидел с автодобавлением в индекс в сортированном порядке. Точнее с предварительным поиском по отсортированному индексу методом половинного деления. И ведь не первый раз такую задачу решаю, только прошлые разы были на VBA в Экселе (не решена была проблема расползания данных в начало, но просто побольше отступал от верха листа), остальное одинаково.
В итоге решилось строчкой кода и кучей выкладок как выбрать стартовую точку, чтобы алгоритм половинного деления даже теоретически не мог зайти ранее первого элемента, но покрывал все элементы. Вкратце, начальный шаг должен быть в 2 раза меньше чем стартовая точка, а стартовая точка примерно посередине текущих элементов индекса на элементе с номером со степени двойки. Очевидно? Очевидно, только не сразу приходит на ум.
После этого добавил строку, что если последнего элемента "мало", возвращать следующую позицию и заработало. Это конечно внутренний "глюк", но "пользовательский поиск" фильтрует данные предварительного поиска, а добавление как раз добавляет элемент в предварительно возвращенную позицию. Главное не обратиться к позиции раньше чем добавит элемент и на этот случай CriticalSection закрывает этот промежуток времени до добавления элемента. Теперь хоть меньше времени будет уходить мириады всяких простеньких списков и списочков - отстается только менять тип элементов в индексе под нужную задачу, привязать к новому массиву и вот он новый списочек с индексом.
Отредактировано пользователем 4 декабря 2019 г. 13:02:57(UTC)
| Причина: Не указана
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 25.09.2019(UTC) Сообщений: 9 Сказал «Спасибо»: 5 раз Поблагодарили: 1 раз в 1 постах
|
Автор: Dmitriy_Zh Автор: two_oceans В этой теме пару страниц назад вроде бы скидывали ссылку на один из проектов.
В целом да, вручную наше все, я в другой среде, но тоже пишу сам - сейчас вот думаю свой генератор сделать, чтобы не выписывать для каждой схемы элементы вручную. Один раз прочитать схему, сделать дамп в своем формате и по нему работать. У меня получилось выполнить в итоге эталонные запросы. Тестовый проект смотрел))) Но он реализован очень запутанно. Я для наших проектов буду делать библиотеку свою. Самое сложное - подписать данные в правильном виде. Сейчас сделал это с помощью костылей. Хочу в ближайшие дни заставить работать автосгенерированный код Можно конечно было по проще написать, но тема сама по себе не простая. Рад если кому то помог пример кода. Ели бы еще где брали код поставили лайк. Было бы приятно и видно что код кому то помог)
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 30.01.2019(UTC) Сообщений: 43 Откуда: Москва Сказал(а) «Спасибо»: 3 раз Поблагодарили: 5 раз в 5 постах
|
Добрый день. Продолжается наше хождение по граблям XML signing. На днях при работе со СМЭВ 3 на некоторых документах начали получать ошибку проверки ЭОП. Разбирательство с данными вывело нас на следующее. 1. В документе присутствует атрибут в значении которого есть символы < 0x20 (всеми любимые символы возврата каретки и перевода строки) 2. Доступные нам онлайн сервисы проверки GOST XmlDSig работают все по разному а) КриптоПро - вставляет в смэв трансформеры бинарные символы 0x0d 0x0а (согласно поведению MS.NET XmlWriter) документ валидируется. б) Тестовый контур GisGMP (https://smev3.gosuslugi.ru/portal/checkxmlform.jsp)занимается непонятно чем и не валидирует документ. в) Реализация https://www.securitycode.ru/products/jinn-server/ при трансформации вставляет XML Entity reference (
) и при соответствующих правках нашего трансформера документ тоже валидирует. Возникает вопрос как поступать в этом случае. Как мне кажется правильный вариант - в по крайней мере каноникализация по C14N работает именно так. Пример ИСХОДНОГО документа SendRequestRequestNoAttach.xml (2kb) загружен 9 раз(а).Пример подписанного документа со вставкой XmlEntity. signed.xml (4kb) загружен 12 раз(а).С уважением
|
|
|
|
Статус: Эксперт
Группы: Участники
Зарегистрирован: 05.03.2015(UTC) Сообщений: 1,602 Откуда: Иркутская область Сказал(а) «Спасибо»: 110 раз Поблагодарили: 395 раз в 366 постах
|
Добрый день! Немного странно, что форму проверки для СМЭВ 3 назвали как форму гис гмп. Все зависит от того, какие стандарты применены к документу. Общая мысль: C14N почти нигде не применяется в чистом виде, везде с дополнительными оговорками, подготовками или постобработками. Для справки: из символов с кодом ниже пробела (32 или 0x20) в XML в принципе разрешены только символы с кодами 9, 10, 13 и никакие более. Если речь идет о нормализованном (в плане переводов строк) документе/фрагменте, то только символы 10 остаются в роли переводов строки. Сочетание 13+10 заменяется на 10, потом одиночные 13 заменяются на 10. Стандарт проверки электронной подписи подчеркивает, что фрагмент документа должен быть нормализован по переводам строк до передачи в C14N. Чистый алгоритм C14N действительно выдает 
 как каноническую форму символа с кодом 13, однако в случае электронной подписи 13 убираются в документе до C14N. Это совершенно точно касается всех текстовых узлов: кодов 13 нет ни в каком виде; коды 9,10, лишние пробелы - их обработка зависит от параметра PreserveWhitespace (причем не фигурирующего в подписи, только подбирать нужное значение методом тыка). Про значения атрибутов надо перечитать (там вообще головоломная система нормализации whitespace, возможно представление как 	 и так далее), все места кроме значений атрибутов и текстовых узлов "оптимизируются" в C14N - символов 9,10,13 не остается ни в каком представлении. Аналогично стандарту подписи стандарт SOAP также отменяет часть возможностей XML и упрощает документ, поэтому соответствующие выкинутым возможностям пункты C14N даже теоретически не применяются. Переводов строк они не касаются, расписывать не буду. Далее, в СМЭВ 3 создателям надоело маяться с 9,10,13 и после C14N введен обязательный дополнительный трансформ до вычисления хэша. Один из пунктов обязательного трансформа: любые текстовые узлы состоящие только из символов 9,10,13 удаляются, то есть неопределенность с PreserveWhitespace почти обнулена. Почти - потому что любое значение можно обрамить 9,10,13, но это можно окончательно запретить благонамеренной схемой пространства имен. Другой пункт требований СМЭВ 3 гласит, что в самом фрагменте документа соответствующем SignedInfo и его потомкам переводы строк запрещены. Поэтому конечно без выполнения трансформа и требований проверить подпись не получится. Отредактировано пользователем 5 февраля 2020 г. 8:58:06(UTC)
| Причина: Не указана
|
1 пользователь поблагодарил two_oceans за этот пост.
|
migel оставлено 05.02.2020(UTC)
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close