1

Тема: Некорректная ЭП для ГИС ГМП ( версия СМЭВ 3)

Здравствуйте! Стоит задача реализовать взаимодействие со СМЭВ 3 с использованием криптосервера Валидата.
Необходимо подписывать XML-сообщения с помощью алгоритма подписи ГОСТ Р 34.10-2012 с ключом 256 (OID 1.2.643.7.1.1.1.1)

Описание текущего сценария подписи сообщения:

1. Создаем шаблон сообщения

2. Выбираем структуру <SenderProvidedRequestData> - она нам потребуется для расчета ХЭШа, значение которого будет помещено в структуру <DigestValue>

3. Приводим структуру <SenderProvidedRequestData> к каноничному виду согласно алгоритму Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"

4. Трансформируем каноникализированную структуру <SenderProvidedRequestData> согласно алгоритму Algorithm="urn://smev-gov-ru/xmldsig/transform"

5. Получаем значение ХЭШ по алгоритму хэширования ГОСТ Р 34.11-12 с длиной 256(OID 1.2.643.7.1.1.2.2) Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256" 

// C# получение строки BASE64 ХЭШ рассчитаного для строки input
var inputBytes = Encoding.UTF8.GetBytes(input);
var hashCtx = new StreamHashCtx("1.2.643.7.1.1.2.2");
var outputBytes = _vcert.Value.StreamHashMem(hashCtx, inputBytes, true); // Где _vcert.Value - Validata.CryptoServer.VcertObject
var output = Convert.ToBase64String(outputBytes);

6. Создаем структуру <SignedInfo> в которую помещаем информацию об алгоритмах канонизации и подписи. Заполнение значение структуры <DigestValue> строкой полученной в пункте №5

7. Приводим структуру <SignedInfo> к каноничному виду согласно алгоритму Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"

8. Трансформируем каноникализированную структуру <SignedInfo>  согласно алгоритму Algorithm="urn://smev-gov-ru/xmldsig/transform"

9. Получаем значение ХЭШ структуры <SignedInfo> по алгоритму хэширования ГОСТ Р 34.11-12 с длиной 256(OID 1.2.643.7.1.1.2.2) Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256"
Реализация описана в пункте №5

10. Вычисляем значение подписи на основе ХЭШа(не конвертированного в BASE64) полученного в пункте №9

//C# Подписываем ХЭШ. input - Байтовый массив хеша
CertificateId session = new CertificateId();
session.Alias = _cryptoServerSession;
var outputBytes = _vcert.Value.SignHash(session, input);
var output = Convert.ToBase64String(outputBytes);

11. Сохраняем открытый ключ сертификата в BASE64

12. Получаем готовую структуру подписи <Signature>

13. Получаем готовое сообщение для отправки

14. Получаем ответ на отправленное сообщение из пункта №13.

Каждый пункт сценария сопровождается файлом с наименование соответствующим номеру пункта. Файлы загрузил нв облако https://yadi.sk/d/8YlMLNHRs5cToA

Прошу помочь в решении проблемы с формированием подписи сообщения. Поиск ошибки осложняется тем, что у нас нет экземпляра разобранного подписанного примера сообщения, с которым можно было бы сверить формирование собственной подписи и понять на каком из этапов некорректная реализация.

2

Re: Некорректная ЭП для ГИС ГМП ( версия СМЭВ 3)

Добрый день,

Вам необходимо найти тестовый подписанный пример, и попытаться получить такой же  ХЭШ как в примере.
Возможно у Вас ошибка в канонизации.

Еще про мучения со СМЭВ можно почитать тут https://habr.com/ru/company/alfa/blog/350158/

3

Re: Некорректная ЭП для ГИС ГМП ( версия СМЭВ 3)

Я как раз для отладки и использовал пример и статьи https://habr.com/ru/company/alfa/blog/350158/ и уверен, что канонизация проходит верно. В примере ХЭШ считается по другому алгоритму и подпись тоже, но для того чтобы определить корректность входного сообщения передаваемого в функции хэша, я использовал алгоритмы из примера.
Проверял это следующим образом. В примере есть пример сообщения сообщения. Я его трансформировал и получил ХЭШ по   
Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411"  и он совпал с примером.

4 (2019-10-24 11:33:31 отредактировано LTT)

Re: Некорректная ЭП для ГИС ГМП ( версия СМЭВ 3)

Трансформированный вид сообщения:

<ns1:SenderProvidedRequestData xmlns:ns1="urn://x-artefacts-smev-gov-ru/services/message-exchange/types/1.1" Id="SIGNED_BY_CONSUMER"><ns1:MessageID>db0486d0-3c08-11e5-95e2-d4c9eff07b77</ns1:MessageID><ns2:MessagePrimaryContent xmlns:ns2="urn://x-artefacts-smev-gov-ru/services/message-exchange/types/basic/1.1"><ns3:BreachRequest xmlns:ns3="urn://x-artefacts-gibdd-gov-ru/breach/root/1.0" Id="PERSONAL_SIGNATURE"><ns3:RequestedInformation><ns4:RegPointNum xmlns:ns4="urn://x-artefacts-gibdd-gov-ru/breach/commons/1.0">Т785ЕС57</ns4:RegPointNum></ns3:RequestedInformation><ns3:Governance><ns5:Name xmlns:ns5="urn://x-artefacts-gibdd-gov-ru/breach/commons/1.0">ГИБДД РФ</ns5:Name><ns6:Code xmlns:ns6="urn://x-artefacts-gibdd-gov-ru/breach/commons/1.0">GIBDD</ns6:Code><ns7:OfficialPerson xmlns:ns7="urn://x-artefacts-gibdd-gov-ru/breach/commons/1.0"><ns8:FamilyName xmlns:ns8="urn://x-artefacts-smev-gov-ru/supplementary/commons/1.0.1">Загурский</ns8:FamilyName><ns9:FirstName xmlns:ns9="urn://x-artefacts-smev-gov-ru/supplementary/commons/1.0.1">Андрей</ns9:FirstName><ns10:Patronymic xmlns:ns10="urn://x-artefacts-smev-gov-ru/supplementary/commons/1.0.1">Петрович</ns10:Patronymic></ns7:OfficialPerson></ns3:Governance></ns3:BreachRequest></ns2:MessagePrimaryContent><ns1:TestMessage></ns1:TestMessage></ns1:SenderProvidedRequestData>

ХЭШ (Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411"): /jXl70XwnttJB5sSokwh8SaVHwo2gjgILSu0qBaLUAo=
ХЭШ (Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256"): RrR9ig8k4ZisKhsMpmYIY7Iqb8yKv+l1MjFg1kJ9eV0=

Для получения ХЭШа структуры <SignedInfo> использовать алгоритм "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256" или "http://www.w3.org/2001/04/xmldsig-more#gostr3411"?

5

Re: Некорректная ЭП для ГИС ГМП ( версия СМЭВ 3)

В соответствии с информацией опубликованной на https://smev3.gosuslugi.ru/portal/

Информируем вас о том, что согласно письму Федеральной службы безопасности Российской Федерации от 07.09.2018 №149/7/6-363 возможность использования схемы ЭП, соответствующей ГОСТ Р 34.10-2001 «Информационная технология. Криптографическая защита информации. Процессы формирования и проверки электронной цифровой подписи» (далее – ГОСТ-2001), для формирования ЭП продлевается до 31.12.2019.

Владельцам (операторам) информационных систем (далее – ИС), в которых используются ЭП, необходимо в срок не позднее 31.12.2018 провести необходимые мероприятия по встраиванию ГОСТ-2012 в ИС и вводу модернизированных ИС в эксплуатацию.

Вариант заполнения элементов SignatureMethod Algorithm и DigestMethod Algorithm:

<ds:SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256"> 
<ds:DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256">

Надо использовать:
<ds:SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256"> 
<ds:DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256">

Для отладки надо искать подписанный пример на 2012 госте, проходящий проверку на портале https://smev3.gosuslugi.ru/portal/checkxmlform.jsp

К сожалению, у нас такого примера нет.

6

Re: Некорректная ЭП для ГИС ГМП ( версия СМЭВ 3)

Ошибка была в канонизации <SignedInfo>. При верификации подписи каноничный вид получался с префиксами тегов, у меня же без оной. Извините за беспокойство.