Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ 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 раз
Поблагодарили: 394 раз в 366 постах
Цитата:
Я попробовал в наглую после подписи сделать модификации для подгона под их требования, но в итоге файл перестал проходить проверку подписи.
Конечно перестал. В чем суть: <SignatureValue> содержит закодированное значение подписи от SignedInfo. Следовательно любое изменение SignedInfo, в том числе добавление префикса нарушит значение подписи. По факту, надо чтобы префикс уже был до момента вычисления SignatureValue.

Методы как добиться правильного префиса зависят от того, какой функцией и каким интерфейсом подписываете. Через .NET я не помню, чтобы кто-то приводил решение по добавлению префикса. В общем случае, если подписываете через плагин и его дополнительные интерфейсы COM/Python/PHP с указанием TEMPLATE и шаблона, то в шаблон можно просто добавить каркас тега ds:Signature в нужном виде, без заполнения SignatureValue DigestValue
thanks 1 пользователь поблагодарил two_oceans за этот пост.
Андрей * оставлено 02.10.2023(UTC)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.