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

Уведомление

Icon
Error

10 Страницы«<8910
Опции
К последнему сообщению К первому непрочитанному
Offline rafaelkhasanov  
#181 Оставлено : 2 ноября 2021 г. 16:44:49(UTC)
rafaelkhasanov

Статус: Новичок

Группы: Участники
Зарегистрирован: 29.04.2021(UTC)
Сообщений: 7

Здравствуйте, может кто подскажет как можно решить проблему с формированием подписи SOAP содержимого для отправки запросов в СМЭВ 3?

Использую .Net 4.7.2
Крипто про версии 5.0.11998 КС1

Сделал тестовый сертификат через сайт https://www.cryptopro.ru/certsrv/
Хочу собрать раздел подписи для СМЭВ конверта, я так понимаю нужен Private Key/Public key сертификата, но .NET не дружит c ГОСТ алгоритмами.

Код примерно такой,
2021-11-02_16-37-51.png (88kb) загружен 3 раз(а).
SmevSignedXml небольшая обертка над
System.Security.Cryptography.Xml.SignedXml

Соответственно при обращении к Private Key падает ошибка.
1) Можно ли это как-то решить без КриптоПро.NET?
2) Ранее использовалась либа Шарпей, и из-нее трасформ XmlDsigSmevTransform(), что можно сделать тут? Написать свою реализацию? Или еще какие-то способы есть?

т.к. делаю интеграцию SOAP первый раз, и документация СМЭВ оставляет желать лучшего, то думал что достаточно подписать содержимое SenderProvidedRequestData и вставить в тег<ns:CallerInformationSystemSignature/>, но потом методом тыка узнал, что это не так. Хотелось бы уточнить верно ли я получал подпись
Использовал такую команду

При заходе в файл подписи там были нечитаемые символы, не такие как в примерах по СМЭВу, что я сделал неправильно?

Отредактировано пользователем 2 ноября 2021 г. 16:57:44(UTC)  | Причина: Не указана

Offline DanilaK  
#182 Оставлено : 29 апреля 2022 г. 12:44:03(UTC)
DanilaK

Статус: Новичок

Группы: Участники
Зарегистрирован: 07.02.2022(UTC)
Сообщений: 2

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

Помогите разобраться с подписью для СМЭВ 3.

Есть реализация на Java, которая работает и проходит проверку на портале СМЭВ.
Требуется реализовать на С++.

DigestValue и KeyInfo совпадают, а сама подпись различается и не проходит проверку.



Данные, которые пробую подписать:


Хэш от данных (совпадает с работающей версией на JAVA): LB4lt2Dmd+ToGO0hNMDKDmloiCDhFT22+utRriw2thY=

SignedInfo:


Каноникализированное SignedInfo:



Хэш от каноникализированного SignedInfo: HlLxOK8NpkPZCmVbSjZ4veNxPkqNCTsuo0VPkWLYngQ=

Вычисленная (невалидная) подпись от хеша: RZvk/V0sbmhkUDJyki6oQTyzKAUlerc1vigBmw7FKavOJZhzafs52quUkzyGXfwQD+dv2y+rMXwVIAA9h9msrg==

Сформированная XML подпись:



Сообщение в СМЭВ с подписью:




Поскольку отличается только подпись хеша от SignedInfo, подозреваю ошибка где-то здесь:

Отредактировано пользователем 11 мая 2022 г. 11:31:07(UTC)  | Причина: форматирование

Offline two_oceans  
#183 Оставлено : 29 апреля 2022 г. 22:39:47(UTC)
two_oceans

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

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

Сказал(а) «Спасибо»: 105 раз
Поблагодарили: 375 раз в 354 постах
Добрый день!
Коллега, надпись "...здесь правильный сертификат..." не поможет проверить значение подписи. По факту нет описанной процедуры для получения хэша гост-2012 из значения подписи, есть только проверка с участием открытого ключа сертификата.

Код:
if (!CryptHashData(hHash, (BYTE*)input.c_str(), strlen((char*)input.c_str()), 0)) {
Предположительно, что-то не так здесь. Какой текст и длина текста в этом месте? У меня длина 741.
C DigestValue все в порядке
Код:
FindReference(1): 20 -> 23
->GetRefText URI=[#SIGNED_BY_CONSUMER]
GetReferencedText(0,0,#SIGNED_BY_CONSUMER)=0
Start transforms: 783
Transform [xmldsig_BeforeCanonic] (783 783)
Transform [http://www.w3.org/2001/10/xml-exc-c14n#] result = 0 00000000 (783 799)
Transform [xmldsig_BeforeCanonic] (799 799)
Transform [urn://smev-gov-ru/xmldsig/transform] result = 0 00000000 (799 806)
reference_ApplyTransforms = 0 00000000
reference_CheckDigest Fl=0 Pr=1 783 806
Digest time:59 msec
=== INFO: Reference "#SIGNED_BY_CONSUMER" 0
=== INFO: digest ok [LB4lt2Dmd+ToGO0hNMDKDmloiCDhFT22+utRriw2thY=]

Отредактировано пользователем 30 апреля 2022 г. 0:57:28(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил two_oceans за этот пост.
DanilaK оставлено 11.05.2022(UTC)
Offline DanilaK  
#184 Оставлено : 11 мая 2022 г. 11:27:30(UTC)
DanilaK

Статус: Новичок

Группы: Участники
Зарегистрирован: 07.02.2022(UTC)
Сообщений: 2

Сказал(а) «Спасибо»: 1 раз
Спасибо!

Значение хеша от каноникализированного SignedInfo и длина данных (у меня было 742) для подписи помогли найти '\n' на конце base64 значения хеша (DigestValue).
После удаления перевода строки хеш сошелся, а подпись прошла проверку на портале СМЭВ.

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