powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Пытаюсь подписать сообщение ЭЦП
8 сообщений из 8, страница 1 из 1
Пытаюсь подписать сообщение ЭЦП
    #39100372
Фотография flashslash
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!

Пытаюсь подписать сообщение ЭЦП и отправить этот SOAP на удаленный сервер СМЭВ, но все бы ничего, только сервер пишет "Attribute 'wsu:Id' is not allowed"
а я понимаешь по Id в своем Xml ищу данные для подписи.. и подписывается то нормально

то тег в сообщении, которое я успешно подписываю выглядит так:
Код: xml
1.
<ns:SenderProvidedRequestData wsu:Id="SIGNED_BY_CONSUMER"



а сервер хочет, чтобы, без wsu:
Код: xml
1.
<ns:SenderProvidedRequestData Id="SIGNED_BY_CONSUMER"



однако в этом случае код ниже выдает ошибку, " Неверно сформированный элемент reference."

как мне все таки подписать сообщение, чтобы эта ошибка не вылетала ?

вот код C# который модифицировать:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
private XmlDocument SignXmlFile2_with_Microsoft_2(XmlDocument doc, X509Certificate2 Certificate, XmlDocument docOnlyData)
        {
            // Создаём объект SmevSignedXml - наследник класса SignedXml с перегруженным GetIdElement
            // для корректной обработки атрибута wsu:Id. 
            SmevSignedXml signedXml = new SmevSignedXml(doc);

            // Задаём ключ подписи для документа SmevSignedXml.
            signedXml.SigningKey = Certificate.PrivateKey;

            // Создаем ссылку на подписываемый узел XML. В данном примере и в методических
            // рекомендациях СМЭВ подписываемый узел soapenv:Body помечен идентификатором "body".
            Reference reference = new Reference();

            reference.Uri = "#SIGNED_BY_CONSUMER"; //old week "";//работаем со всем документом


            // Задаём алгоритм хэширования подписываемого узла - ГОСТ Р 34.11-94. Необходимо
            // использовать устаревший идентификатор данного алгоритма, т.к. именно такой
            // идентификатор используется в СМЭВ.
#pragma warning disable 612
            reference.DigestMethod = CryptoPro.Sharpei.Xml.CPSignedXml.XmlDsigGost3411UrlObsolete;
#pragma warning restore 612

            #region трансформация
            XmlDsigExcC14NTransform _c14 = new XmlDsigExcC14NTransform();
            _c14.Algorithm = "http://www.w3.org/2001/10/xml-exc-c14n#";
            reference.AddTransform(_c14);

            XmlDsigExcC14NTransform c14 = new XmlDsigExcC14NTransform();
            c14.Algorithm = "urn://smev-gov-ru/xmldsig/transform";
            reference.AddTransform(c14);
            #endregion

            // *MS* Specify a canonicalization method.
            signedXml.SignedInfo.CanonicalizationMethod = SignedXml.XmlDsigExcC14NTransformUrl;

            // Добавляем ссылку на подписываемый узел.
            signedXml.AddReference(reference);

            // Задаём алгоритм подписи - ГОСТ Р 34.10-2001. Необходимо использовать устаревший
            // идентификатор данного алгоритма, т.к. именно такой идентификатор используется в
            // СМЭВ.
#pragma warning disable 612
            //warning CS0612: 'CryptoPro.Sharpei.Xml.CPSignedXml.XmlDsigGost3411UrlObsolete' is obsolete
            signedXml.SignedInfo.SignatureMethod = CryptoPro.Sharpei.Xml.CPSignedXml.XmlDsigGost3410UrlObsolete;
#pragma warning restore 612

            // Вычисляем подпись.
            signedXml.ComputeSignature();

            // Получаем представление подписи в виде XML.
            XmlElement xmlDigitalSignature = signedXml.GetXml();

            // Добавляем необходимые узлы подписи в исходный документ в заготовленное место.
            doc.GetElementsByTagName("ds:Signature")[0].PrependChild(
                doc.ImportNode(xmlDigitalSignature.GetElementsByTagName("SignatureValue")[0], true));
            doc.GetElementsByTagName("ds:Signature")[0].PrependChild(
                doc.ImportNode(xmlDigitalSignature.GetElementsByTagName("SignedInfo")[0], true));

            // Добавляем сертификат в исходный документ в заготовленный узел
            doc.GetElementsByTagName("ds:X509Certificate")[0].InnerText =
                Convert.ToBase64String(Certificate.RawData);

            return doc;
        }
...
Рейтинг: 0 / 0
Пытаюсь подписать сообщение ЭЦП
    #39100594
Фотография flashslash
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
flashslash,

неужели никто нерешал подобные задачи?
...
Рейтинг: 0 / 0
Пытаюсь подписать сообщение ЭЦП
    #39101010
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
flashslash,

Посмотрите эти примеры подписывания ЭЦП
http://www.cryptopro.ru/blog/2012/05/16/podpis-soobshchenii-soap-dlya-smev-s-ispolzovaniem-kriptopro-net
class SmevSignedXml
...
Рейтинг: 0 / 0
Пытаюсь подписать сообщение ЭЦП
    #39101014
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XmlNamespaceManager.AddNamespace
...
Рейтинг: 0 / 0
Пытаюсь подписать сообщение ЭЦП
    #39101464
Фотография flashslash
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotek,

ок, спасибо, я понял, что мне наоборот надо было убрать перегрузку
Код: c#
1.
public override XmlElement GetIdElement


теперь получилось.. но СМЭВ продолжает отвечать "ЭП-ОВ не подтверждена: Ошибка проверки ЭП: Нарушена целостность ЭП"

но я не пойму никак, для чего префиксы типа ds как того требует СМЭВ
Код: xml
1.
<ds:SignedInfo>


потому что у меня крипто про выполняет
Код: c#
1.
ComputeSignature()


где я получаю xml-структуру
Код: c#
1.
XmlElement xmlDigitalSignature = signedXml.GetXml();


без ds-префикса...
на сколько это важно и если префиксы важны, то как добиться их появления ?
...
Рейтинг: 0 / 0
Пытаюсь подписать сообщение ЭЦП
    #39101816
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
flashslash,

Понятия не имею )
Насколько я понимаю заморочки с неймспейсами пошли в СМЭВ 3, я не разбирался.
Мучайте их тех поддерку.
...
Рейтинг: 0 / 0
Пытаюсь подписать сообщение ЭЦП
    #39101822
Фотография flashslash
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotek,

ок, спасибо!
если все получится, напишу потом статью на эту тему..
...
Рейтинг: 0 / 0
Пытаюсь подписать сообщение ЭЦП
    #39101943
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
flashslash,

Тогда сразу и медаль выдадут, от лица всех страждущих.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Пытаюсь подписать сообщение ЭЦП
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]