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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Petro1985pr  
#1 Оставлено : 28 сентября 2023 г. 10:58:07(UTC)
Petro1985pr

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

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

Добрый день!
Я новичок в мире криптографии и электронных подписей, но на работе поставили задачу реализовать сервис для подписи XML.
Покурил документацию, посмотрел какие алгоритмы нужны и вроде бы все получилось. Результат выглядит следующим образом:
Код:
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Header />
    <soapenv:Body>
        <ns1:SendRequestRequest xmlns:ns1="urn://x-artefacts-mcx-gov-ru/fgiz-zerno/api/ws/types/1.0.5">
            <ns1:MessageData Id="SIGNED_BY_CALLER">
                <ns1:MessageID>6540c547-38c7-4d83-b2eb-a9cf917dcb81</ns1:MessageID>
                <ns1:ReferenceMessageID>6540c547-38c7-4d83-b2eb-a9cf917dcb81</ns1:ReferenceMessageID>
                <ns1:MessagePrimaryContent>
                    <n0:Request xmlns:n0="urn://x-artefacts-mcx-gov-ru/fgiz-zerno/api/ws/dictionaries/1.0.6">
                        <n0:Dictionary>OKPD2</n0:Dictionary>
                        <n0:IsActual>true</n0:IsActual>
                        <n0:Paging pageNumber="0" pageLength="500" />
                    </n0:Request>
                </ns1:MessagePrimaryContent>
            </ns1:MessageData>
            <ns1:InformationSystemSignature>
                <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
                    <SignedInfo>
                        <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
                        <SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256" />
                        <Reference URI="#SIGNED_BY_CALLER">
                            <Transforms>
                                <Transform Algorithm="urn://smev-gov-ru/xmldsig/transform" />
                            </Transforms>
                            <DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256" />
                            <DigestValue>zLPQbeGc6buq+DaYcBmK6Fr13MeJPzUC5rjJlht38gw=</DigestValue>
                        </Reference>
                    </SignedInfo>
                    <SignatureValue>S9DUL7HSpwZm1pU8WXzxCCr6R3/yy61A1a/QrA4I4Q1c7KVpqhSSrXeDILNLi38iGFxUKneV9BijEAvDyUYI9A==</SignatureValue>
                    <KeyInfo>
                        <X509Data>
                            <X509Certificate></X509Certificate>
                        </X509Data>
                    </KeyInfo>
                </Signature>
            </ns1:InformationSystemSignature>
        </ns1:SendRequestRequest>
    </soapenv:Body>
</soapenv:Envelope>


Я уж обрадовался и отправил все это счастье на API ФГИС Зерно. Но не тут-то было, получил ответ, что нужно в обязательном порядке у тега <Signature> сделать префикс ds.
То-есть, они хотят видеть этот так вот в таком виде:
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
И тоже касается всех узлов внутри <ds:SignedInfo>, <ds:CanonicalizationMethod> и т.д.
Я попробовал в наглую после подписи сделать модификации для подгона под их требования, но в итоге файл перестал проходить проверку подписи.
И вот вопрос, можно как-то сделать, чтобы подпись уже сразу была с префиксом "ds"? Или возможно я думаю не в ту сторону, тогда прошу направить в правильную.
Offline two_oceans  
#2 Оставлено : 2 октября 2023 г. 6:31:37(UTC)
two_oceans

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

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

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 395 раз в 366 постах
Цитата:
Я попробовал в наглую после подписи сделать модификации для подгона под их требования, но в итоге файл перестал проходить проверку подписи.
Конечно перестал. В чем суть: <SignatureValue> содержит закодированное значение подписи от SignedInfo. Следовательно любое изменение SignedInfo, в том числе добавление префикса нарушит значение подписи. По факту, надо чтобы префикс уже был до момента вычисления SignatureValue.

Методы как добиться правильного префиса зависят от того, какой функцией и каким интерфейсом подписываете. Через .NET я не помню, чтобы кто-то приводил решение по добавлению префикса. В общем случае, если подписываете через плагин и его дополнительные интерфейсы COM/Python/PHP с указанием TEMPLATE и шаблона, то в шаблон можно просто добавить каркас тега ds:Signature в нужном виде, без заполнения SignatureValue DigestValue
thanks 1 пользователь поблагодарил two_oceans за этот пост.
Андрей * оставлено 02.10.2023(UTC)
Offline Leha1001  
#3 Оставлено : 24 июня 2024 г. 17:54:14(UTC)
Leha1001

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

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

День добрый. Тема создана давно, но. На днях получил такую же задачу с ФГИС "Зерно".
Собрать запрос не проблема, но вот уткнулся в "XML-фрагмент не соответствует значению ЭЦП."
Искал по форумам и наткнулся на эту тему.
В документации на API ФГИС "Зерно" написано: "Перед отправкой сообщения с запросом ЭЦП формируется для блока структурированных сведений MessageData, подписывается содержимое элемента, заключённое между открывающим и закрывающим тегами элемента."
Я второй день пытаюсь подписывать блок
<ns:MessageID>77413256-744a-4897-8302-c8d8e4faf65e</ns:MessageID><ns:ReferenceMessageID>77413256-744a-4897-8302-c8d8e4faf65e</ns:ReferenceMessageID><ns:MessagePrimaryContent><n0:Request xmlns:n0="urn://x-artefacts-mcx-gov-ru/fgiz-zerno/api/ws/dictionaries/1.0.8"><n0:Dictionary>OKPD2</n0:Dictionary><n0:IsActual>true</n0:IsActual><n0:Paging pageNumber="0" pageLength="500" /></n0:Request></ns:MessagePrimaryContent>



И все время получаю "XML-фрагмент не соответствует значению ЭЦП."
Подскажите, чего я недопонял? Нужно подписывать блок SignedInfo?
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.