Добрый день. Снова пока меня не было никто не объяснил, что делаете не так.
Как я понял, Вы либо использовали алгоритмы не те что указаны в SignedInfo либо
алгоритм хэша не соответствует алгоритму подписи. Немного странно, что хэш вычислен "GOST3411" (
по гост-94 как для подписи по гост-2001).
Смешение гост-2012 со старыми алгоритмами запрещено административно, но не противоречит стандарту XMLDSIG. Математически, хэш в пункте 1 может быть и гост-94 вместо гост-2012 если в SignedInfo алгоритм хэша указан как гост-94, даже вместе с алгоритмом подписи гост-2012. Тестовая страничка наверно и алгоритм подписи гост-2001 примет, но сама СМЭВ уже требует гост-2012.
Если еще актуально, ну и чтобы не повторяли за Вами, напомню шаги XMLDSIG.
1) сначала Вы считаете хэш от подписываемого каноникализированного и трансформированного фрагмента.
2) из хэша вычисленного в пункте 1 формируете структуру SignedInfo. Каноникализируете ее (но не трансформируете). У меня обычно добавляется 1 объявление пространства имен, остальное как было.
3) вычисляете хэш от SignedInfo. Значение хэша от SignedInfo само нигде не фигурирует в итоговом документе, что делает отладку еще сложнее. Алгоритм хэша здесь должен быть согласован с алгоритмом подписания - если ключ гост-2012, то хэш
должен быть гост-2012, хэш гост-94 уже не прокатит.
4) подписываете хэш от SignedInfo. Обратите внимание, что тут нежелательно использовать SignHash, так как у Вас может оказаться 2 объекта хэша с разными алгоритмами, но одной длиной хэша (
один внутри экземпляра класса Gost с гост-2012, второй myhash с гост-94). В этом случае Вы не получите ошибку о несоответствии алгоритма, но подпись будет неверна. Поэтому корректнее использовать Sign/SignData от inputBytes.
5) подписанное значение указываете в SignatureValue, при необходимости зеркалите массив байтов (меняете первый байт с последним, второй с предпоследним и т.д.) до Base64 кодирования. Вроде бы .Net уже переворачивает в фоновом режиме, но мало ли.
С порядком байт вообще все сложно - у меня впечатление что для гост-2012 порядок байт в SignatureValue значения не имеет - предположу что СМЭВ проверяет на основе Джавы и принимает оба варианта для гост-2012. Чего не скажешь о .NET, который принимает только свой вариант порядка байтов подписи.
Если Вы проверяете на тестовой страничке портала СМЭВ 3, то там сертификат без разницы каким УЦ выдан. Проверяется чисто математика.
Если Вы отправляете в СМЭВ 3, то сертификат и УЦ имеют значение, а также они должны быть зарегистрированы к конкретной ИС. Можно запросить сертификат для тестовой/среды разработки СМЭВ 3 у тестового УЦ ростелекома через Ситуационный центр, но и аккредитованный УЦ тоже подойдет. Для продуктивной сертификат должен быть от аккредитованного УЦ.
Отредактировано пользователем 23 июля 2020 г. 3:24:57(UTC)
| Причина: Не указана