powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Крипто про. Подпись XML двумя сертификатами
3 сообщений из 3, страница 1 из 1
Крипто про. Подпись XML двумя сертификатами
    #39794645
listtoview
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги, столкнулся с тем что стандартный пример от крипто про по подписи двумя сертификатами не работает.
Задал вопрос на их форуме: https://www.cryptopro.ru/forum2/default.aspx?g=posts&m=101896#post101896
Если кто сталкивался, буду благодарен.

подпись происходит так:
Код: 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.
// Подписывает XML документ и сохраняем подпись в документе.
        static void SignXmlDocument(XmlDocument doc,
            AsymmetricAlgorithm Key, X509Certificate Certificate)
        {
            // Создаем объект SignedXml по XML документу.
            SignedXml signedXml = new SignedXml(doc);

            // Добавляем ключ в SignedXml документ. 
            signedXml.SigningKey = Key;

            // Создаем ссылку на node для подписи.
            // При подписи всего документа проставляем "".
            Reference reference = new Reference();
            reference.Uri = "";

            // Явно проставляем алгоритм хэширования,
            // по умолчанию SHA1.
            reference.DigestMethod =
                CPSignedXml.XmlDsigGost3411Url;

            // Добавляем transform на подписываемые данные
            // для удаления вложенной подписей, не только
            // собственной.
            XmlDsigXPathTransform xpath = CreateXPathTransform();
            reference.AddTransform(xpath);

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

            // Создаем объект KeyInfo.
            KeyInfo keyInfo = new KeyInfo();

            // Добавляем сертификат в KeyInfo
            keyInfo.AddClause(new KeyInfoX509Data(Certificate));

            // Добавляем KeyInfo в SignedXml.
            signedXml.KeyInfo = keyInfo;

            // Можно явно проставить алгоритм подписи: ГОСТ Р 34.10.
            // Если сертификат ключа подписи ГОСТ Р 34.10
            // и алгоритм ключа подписи не задан, то будет использован
            // XmlDsigGost3410Url
            // signedXml.SignedInfo.SignatureMethod =
            //     CPSignedXml.XmlDsigGost3410Url;

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

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

            // Добавляем node подписи в XML документ.
            doc.DocumentElement.AppendChild(doc.ImportNode(
                xmlDigitalSignature, true));
        }



проверка подписи:

Код: 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.
        // Проверка подписи под XML документом.
        static void VerifyXmlFile(String Name)
        {
            // Создаем новый XML документ в памяти.
            XmlDocument xmlDocument = new XmlDocument();

            // Сохраняем все пробельные символы, они важны при проверке 
            // подписи.
            xmlDocument.PreserveWhitespace = true;

            // Загружаем подписанный документ из файла.
            xmlDocument.Load(Name);

            // Ищем все node "Signature" и сохраняем их в объекте XmlNodeList
            XmlNodeList nodeList = xmlDocument.GetElementsByTagName(
                "Signature", SignedXml.XmlDsigNamespaceUrl);

            // Проверяем все подписи.
            for (int curSignature = 0; curSignature < nodeList.Count; curSignature++)
            {
                // Создаем объект SignedXml для проверки подписи документа.
                SignedXml signedXml = new SignedXml(xmlDocument);

                // Загружаем узел с подписью.
                signedXml.LoadXml((XmlElement)nodeList[curSignature]);

                // Проверяем подпись и выводим результат.
                bool result = signedXml.CheckSignature();

                // Выводим результат проверки подписи в консоль.
                if (result)
                    Console.WriteLine("XML подпись[{0}] верна.", curSignature + 1);
                else
                    Console.WriteLine("XML подпись[{0}] не верна.", curSignature + 1);
            }
        }
...
Рейтинг: 0 / 0
Крипто про. Подпись XML двумя сертификатами
    #39795031
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И где же вопрос?
...
Рейтинг: 0 / 0
Крипто про. Подпись XML двумя сертификатами
    #39795161
listtoview
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг ХупинИ где же вопрос?
был, да вышел весь)
бага в некоторых сборках винды, по ссылке есть инфа

вопрос снят. всем спасибо
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Крипто про. Подпись XML двумя сертификатами
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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