Форум программистов, компьютерный форум, киберфорум
C#: Веб-сервисы, WCF
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.96/539: Рейтинг темы: голосов - 539, средняя оценка - 4.96
 Аватар для hhmm
67 / 58 / 1
Регистрация: 01.04.2016
Сообщений: 346
.NET 4.x

Интеграция с ГИС ЖКХ и подпись SOAP без Крипто .NET и stunnel

06.04.2017, 22:27. Показов 110970. Ответов 256

Студворк — интернет-сервис помощи студентам
Решил создать отдельную тему, так как в теме Интеграция с ГИС ЖКХ. Подпись SOAP и защита канала по ГОСТ (4) - C# WCF уже можно заблудиться.

Причиной написания данной куклы/тестового приложения стало желание избавиться от зависимости от Крипто .NET.

За прошедший год с момента начала использования Крипто .NET у меня к нему накопился ряд претензий, таких как:
1. Работа только с одним, своим, криптопровайдером
2. Навязчивая загрузка во все приложения, даже туда, где он не нужен
Как следствие, это приводит к невозможности использования ряда приложений, таких как, например, NUnit Framework


Не хочу сказать ничего плохого в адрес разработчиков КриптоКом.
Они и сами признают на своем форуме, что внедрение чужеродных алгоритмов шифрования в операционные системы Windows это очень непростая задача.
Но все-таки в результате Крипто .NET получился, по моему опыту, настолько глючным, что пользоваться им в работе становится весьма обременительным.

Предлагаемая кукла обеспечивает работу с ГИС ЖКХ без настоятельно навязываемых Ланитом продуктов КриптоКом, таких как stunnel и Крипто .NET.
Для работы используются стандартные вызовы CryptoAPI, так что криптопровайдера установить придется,
соответствующего полученному в УЦ ключу, CryptoPro CSP или ViPNet CSP.

Что было сделано:
1. За основу была взята реализация springjazzy (https://github.com/springjazzy/Xades) выложенная с составе примера начального уровня выложенного Anvano. Учтены/приняты во внимание замечания других участников форума
2. Была написана обертка для работы с CryptoAPI (с использованием найденного куска от Microsoft), в ней был выделен интерфейс ICryptoProvider декларирующий минимально необходимый функционал для подписи
3. Реализация springjazzy из пункта 1 была подвергнута переработке в следующих направлениях:
3.1. Был выкинут весь неиспользуемый функционал класса XadesSignedXml для облегчения чтения и понимания, что там вообще происходит
3.2. Последовательным движением в глубину текстов библиотеки Xades и замены рефлексии методов .NET на куски текста Microsoft удалось избавить класс XadesSignedXml от
криптографии .NET. Вызовы криптографии .NET были заменены на вызовы трех методов ICryptoProvider из п.2

Таким образом, сейчас подпись Xades в данном приложении осуществляется следующим образом:

C#
1
2
ICryptoProvider CryptoProvider = GetCryptoProvider(SigningSertificate);
signedXml.ComputeSignature(CryptoProvider.ComputeHash, CryptoProvider.ComputeSignature, CryptoProvider.ReverseSignature);
где:
  • signedXml - экземпляр класса XadesSignedXml из модифицированной библиотеки
  • ComputeHash - функция расчета хэша вида byte[] ComputeHash(byte[] Data)
  • ComputeSignature - функция расчета подписи вида byte[] ComputeSignature(byte[] Data)
  • ReverseSignature - свойство типа bool, показывающее библиотеке, нужно ли переворачивать полученную подпись:8 Выяснилась занятная деталь: Крипто .NET и CryptoPro CSP оба выдают верные подписи (для одного и того же сертификата), но одну из них нужно зеркально перевернуть, чтобы ее принял ГИС ЖКХ. Почему там сделано - не знаю, это наверное можно спросить в КриптоКом

  • Кукла проверена на машине где установлен как Крипто .NET так и CryptoPro CSP
  • После чего Крипто .NET был удален
  • Компьютер был перезагружен для завершения удаления (два раза, так как с первого раза Крипто .NET удаляться не захотел)
  • После этого осталась работоспособной только часть, работающая через CryptoApi

С ключами Инфотекса у меня в настоящее время возможности проверить работоспособность нет, так как тестовый ключ Инфотекса уже не рабочий.

У кого есть возможность проверить, просьба сообщить о результатах.

Из имеющихся в настоящий момент не исправленных глюков - ошибка связанная с некорректным освобождением памяти при выходе при приложения. Подозреваю, что ошибка где-то в обертке CryptoAPI, но где - пока непонятно.


В прилагаемом архиве исходные тексты куклы и релизная сборка приложения.

Отзывы и конструктивная критика принимаются.

С уважением к участникам форума,
hhmm

Дополнение от 18.10.2018:

В данной теме есть и другие решения предложенные участниками, вынесены в шапку для облегчения навигации:

1. gizmo23 предложил свой вариант библиотеки.
В основу был взят тот же проект signature-demo-net. Все ссылки в сообщении.
Первоначальное обсуждение продолжалось до post10628102

2. umatkot предложил утилиту для проверки работоспособности сервера ГИС ЖКХ. Утилита (по словам автора) использует еще более усовершенствованную версию библиотеки подписи.

3. Дополнение на тему альтернативных криптопровайдеров: месяц назад один из клиентов предоставил на опыты реальный, не тестовый ключ, ViPNet CSP выданный настоящим удостоверяющим центром. Попытка прикрутить провайдера ViPNet CSP к ГИС ЖКХ успехом не увенчалась. Несмотря на то, что на машину удалось установить два криптопровайдера одновременно и каждый из них отдельно видел и успешно читал свои ключи, попытка подключиться с ключом ViPNet CSP к ППАК ГИС ЖКХ не удалась. Проблемы возникли на транспортном уровне, такие же какие бывают у Крипто .Net клиент когда обновляется .Net Framework - 'Unable establish secure SSL/TLS channel to api.dom.dosuslugi.ru'. До подписи дело не дошло.
То ли там что-то еще нужно докупать у Инфотекса, то ли ViPNet CSP не может внедриться на транспортном уровне. В общем, у меня не получилось. Потратил один день, после чего эксперименты прекратил.

Дополнение от 24.01.2018:

4. vst377 предложил набор классов реализующих работу в ГИС ЖКХ файловых сервисов.
Вложения
Тип файла: zip GisBusted.zip (4.17 Мб, 676 просмотров)
11
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.04.2017, 22:27
Ответы с готовыми решениями:

.NET 4.x Интеграция с ГИС ЖКХ. Подпись SOAP и защита канала по ГОСТ (2)
Начало темы здесь: https://www.cyberforum.ru/web-services-wcf/thread1615223.html umatkot, Да, к этому и пришел....а на дворе 1 июля ...

Интеграция с ГИС ЖКХ. Подпись SOAP и защита канала по ГОСТ (4)
Предыдущая тема: https://www.cyberforum.ru/web-services-wcf/thread1800721.html Здравствуйте. Подскажите, пожалуйста: делаю getState...

Интеграция с ГИС ЖКХ. Подпись SOAP и защита канала по ГОСТ (5)
Предыдущая тема: https://www.cyberforum.ru/web-services-wcf/thread1840159.html И так мы Я и umatkot, Берёмся за реализацию всего этого...

256
16 / 15 / 1
Регистрация: 18.04.2016
Сообщений: 82
27.02.2020, 14:04
Студворк — интернет-сервис помощи студентам
Не долго музыка играла...
Неделю две назад все прекрасно улетало в ГИС (ГОСТ 2012).
Сегодня получил новый ключ с сертификатом.
Установил.Прописал в программе своей. Закинул файл сертификата в ГИС.
И приехали...
"Ошибка формата подписи запроса" "AUT011005"
Есть идеи , чем могут ключи отличаться? И тот и другой 2012 256. Выданы одним и тем же центром....
0
0 / 0 / 0
Регистрация: 24.01.2020
Сообщений: 10
27.02.2020, 23:47
Есть кто живой. Рабочий проект есть.. на боевом работает без stunnel?

Добавлено через 3 часа 44 минуты
Может хоть за платно кто подсобит?..ни хрена не работает без туннеля!
0
187 / 100 / 19
Регистрация: 15.09.2011
Сообщений: 801
28.02.2020, 02:17
foxwizard, доброй пятницы! подпиши один и тот же запрос двумя подписями и сравни... У меня всё работает через GisServiceTest

Добавлено через 3 минуты
hantik, Какого уровня нужен проект, опиши поподробнее в личке. Доработать можно мой GisServiceTest - чтобы грузил информацию из БД и посылал запросы.
Без stunnel всё прекрасно работает.

Добавлено через 1 минуту
foxwizard, возможно, у них косяки именно с новыми сертификатами, которые добавляются сейчас (даже если это 12 ГОСТ)
1
16 / 15 / 1
Регистрация: 18.04.2016
Сообщений: 82
28.02.2020, 09:59
Пробовал подписывать еще и http://www.cyberforum.ru/post13671303.html
ServiceHelperHost.SignLibrary.rar
Те же яйца...
Umatkot_Primtep, GisServiceTest не нашел. Есть ссылочка?
0
0 / 0 / 0
Регистрация: 24.01.2020
Сообщений: 10
28.02.2020, 10:18
в ЛС не пишется ..
0
0 / 0 / 0
Регистрация: 24.01.2020
Сообщений: 10
28.02.2020, 10:21
Вот готовый проект .. только всё равно получаешь информационная система не найдена.
Вложения
Тип файла: rar GisServiceTest_CFv1.rar (6.48 Мб, 102 просмотров)
0
16 / 15 / 1
Регистрация: 18.04.2016
Сообщений: 82
28.02.2020, 11:49
hantik, Ну и мой пример работает. Ну до середины февраля точно работал со старым ключом...
Интеграция с ГИС ЖКХ и подпись SOAP без Крипто .NET и stunnel
Только у меня сейчас новый ключ. Сним бяда. Не пойму пока в чем дело.

Добавлено через 28 минут
hantik, Твой аналогично у меня с той-же ошибкой формата подписи.
Ты в своем <h:orgPPAGUID>c3f65dab-ea5d-4765-af23-83effe999999</h:orgPPAGUID> менял на свой?
Иначе 400 ошибка.
1
0 / 0 / 0
Регистрация: 24.01.2020
Сообщений: 10
28.02.2020, 14:15
Да, пробовал. .но ещё раз поверю..

Добавлено через 1 час 3 минуты
Цитата Сообщение от foxwizard Посмотреть сообщение
Добавлено через 28 минут
hantik, Твой аналогично у меня с той-же ошибкой формата подписи.
Ты в своем <h:orgPPAGUID>c3f65dab-ea5d-4765-af23-83effe999999</h:orgPPAGUID> менял на свой?
Иначе 400 ошибка.
Да .. всё то же

Цитата Сообщение от hantik Посмотреть сообщение
Иначе 400 ошибка.
- ни разу не было!
0
 Аватар для hhmm
67 / 58 / 1
Регистрация: 01.04.2016
Сообщений: 346
28.02.2020, 15:18  [ТС]
Цитата Сообщение от foxwizard Посмотреть сообщение
Только у меня сейчас новый ключ. Сним бяда. Не пойму пока в чем дело.
А открытую часть, сертификат можно глянуть?
Может там атрибуты левые, которые ГИС ЖКХ не понимает.

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

Помните:

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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
    /// <summary>
    /// Вспомогательный класс ключ/значение
    /// </summary>
    internal sealed class ReplacementPair
        {
        /// <summary>
        /// Ключ
        /// </summary>
        public string Key
            {
            get; set;
            }
 
        /// <summary>
        /// Значение
        /// </summary>
        public string Value
            {
            get; set;
            }
        }
 
 
/// <summary>
/// Исправить строку X509IssuerName для рукожопых писателей из Ланита
/// </summary>
/// <param name="X509IssuerName">Исходная строка из сертификата</param>
/// <returns>Исправленная строка, чтобы ее понимал сервер ГИС ЖКХ</returns>
public static string IssuerNamePatcher(string X509IssuerName)
    {
    // return "CN=Ланит - отличная компания";
 
    // string[] Parts = X509IssuerName.Split(','); // не всегда работает как хотелось бы...
    List<string> Parts = SplitString(X509IssuerName);
 
    List<ReplacementPair> Pairs = new List<ReplacementPair>();
 
    foreach (string Part in Parts)
        {
        string[] LRParts = Part.Split('=');
        ReplacementPair rp = new ReplacementPair();
        rp.Key = LRParts[0];
        rp.Value = LRParts[1];
        Pairs.Add(rp);
        }
 
    // замена
    foreach (ReplacementPair Pair in Pairs)
        {
        // Title
        if (Pair.Key.Equals("T", StringComparison.OrdinalIgnoreCase) || Pair.Key.Equals("Title", StringComparison.OrdinalIgnoreCase))
            {
            Pair.Key = "2.5.4.12";
            continue;
            }
 
        // GivenName
        if (Pair.Key.Equals("G", StringComparison.OrdinalIgnoreCase) || Pair.Key.Equals("GivenName", StringComparison.OrdinalIgnoreCase))
            {
            Pair.Key = "2.5.4.42";
            continue;
            }
 
        // SurName
        if (Pair.Key.Equals("SN", StringComparison.OrdinalIgnoreCase) || Pair.Key.Equals("SurName", StringComparison.OrdinalIgnoreCase))
            {
            Pair.Key = "2.5.4.4";
            continue;
            }
 
        // OrgUnit
        if (Pair.Key.Equals("OU", StringComparison.OrdinalIgnoreCase) || Pair.Key.Equals("OrgUnit", StringComparison.OrdinalIgnoreCase))
            {
            Pair.Key = "2.5.4.11";
            continue;
            }
 
        // Unstructured-Name
        if (Pair.Key.Equals("Unstructured-Name", StringComparison.OrdinalIgnoreCase) || Pair.Key.Equals("UnstructuredName", StringComparison.OrdinalIgnoreCase))
            {
            Pair.Key = "1.2.840.113549.1.9.2";
            continue;
            }
 
        // http://www.alvestrand.no/objectid/1.2.840.113549.1.9.1.html Email Address
        // attribute for use in signatures - 1.2.840.113549.1.9.1
        if (Pair.Key.Equals("E", StringComparison.OrdinalIgnoreCase) || Pair.Key.Equals("e-mailAddress", StringComparison.OrdinalIgnoreCase))
            {
            Pair.Key = "1.2.840.113549.1.9.1";
            continue;
            }
        } // end foreach
 
    // Собираем обратно в строку
    StringBuilder sb = new StringBuilder();
    int nCount = Pairs.Count;
 
    for (int i = 0; i < nCount; i++)
        {
        sb.Append(Pairs[i].Key);
        sb.Append("=");
        sb.Append(Pairs[i].Value);
        if (i != (nCount - 1))
            {
            sb.Append(", ");
            }
        }
 
    string Result = sb.ToString();
    return Result;
    }
0
0 / 0 / 0
Регистрация: 24.01.2020
Сообщений: 10
28.02.2020, 21:25
Получил
XML
1
2
3
4
5
6
7
8
9
10
11
12
<ns4:ResultHeader>
            <ns4:Date>2020-02-28T20:44:05.402+03:00</ns4:Date>
            <ns4:MessageGUID>32937573-1207-4909-a8ff-a166499eb825</ns4:MessageGUID>
        </ns4:ResultHeader>
    </env:Header>
    <env:Body>
        <ns4:AckRequest>
            <ns4:Ack>
                <ns4:MessageGUID>7b62a4fe-5a2a-11ea-8abc-005056b62471</ns4:MessageGUID>
                <ns4:RequesterMessageGUID>32937573-1207-4909-a8ff-a166499eb825</ns4:RequesterMessageGUID>
            </ns4:Ack>
        </ns4:AckRequest>
Как дальше получить данные по Ack - >MessageGUID?
0
187 / 100 / 19
Регистрация: 15.09.2011
Сообщений: 801
02.03.2020, 02:19
hantik, Если моей утилитой пользовался, то я объясню - это асинхронный ответ на запрос, который содержит ссылку <ns4:MessageGUID>7b62a4fe-5a2a-11ea-8abc-005056b62471</ns4:MessageGUID>

Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:b="http://dom.gosuslugi.ru/schema/integration/base/">
  <s:Header>
    <b:RequestHeader>
      <b:Date></b:Date>
      <b:MessageGUID></b:MessageGUID>
      <b:orgPPAGUID></b:orgPPAGUID>
      <b:IsOperatorSignature>true</b:IsOperatorSignature>
    </b:RequestHeader>
  </s:Header>
  <s:Body>
    <b:getStateRequest>
      <b:MessageGUID>Вот здесь он вставляется</b:MessageGUID>
    </b:getStateRequest>
  </s:Body>
</s:Envelope>


По ней делаешь GET STATE - стандартный шаблон. Ответ получаешь в рамках той инфраструктуры, в которой посылал сам асинхронный запрос. Например, если посылал для HouseManagement, то getState вернёт структуры из этой же области(ME-HouseManagementServiceAsync#getState). Если Bills, то и GetState используешь от Biils
(ME-BillsServiceAsync#getState) - из Альбом ТФФ v.13.1.1.4 Приложение 1
Вообще, та утилита делает обработку из выбранного шаблона (нужно убрать нижний подчерк у файла в папке Requests2Process). А вся связка документов вылазит в RequestsProcessResults - там 4 файла -
1) первичный асинхронный запрос,
2) ответ (тот, который ты прикрепил),
3) запрос getState и
4) ответ от сервера с данными.

Добавлено через 2 минуты
Для того, чтобы привязать эту утилиту к системе её нужно дорабатывать, так как она сделана для общих случаев и просто для теста и анализа стуктур данных, которые возвращает ГИС и тех, которые требуется послать на ГИС.
1
187 / 100 / 19
Регистрация: 15.09.2011
Сообщений: 801
02.03.2020, 02:39
foxwizard, да, я то думал, что ты вкурсе про этот момент. В GisServiceTest я его исключил так как просто проблем не было с этим.
Держи исходник SignLibrary - там надо раскомментировать IssuerNamePatcher() в этом методе

Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public Cert GetBouncyCertificate()
        {
            var x509CertificateParser = new Org.BouncyCastle.X509.X509CertificateParser();
            var bouncyCert = x509CertificateParser.ReadCertificate(Certificate.RawData);
 
            return new Cert(DigestMethod, HashAlgorithm.ComputeHash(Certificate.RawData))
            {
                IssuerSerial =
                {
                    X509IssuerName = bouncyCert.IssuerDN.ToString()/*.IssuerNamePatcher()*/,
                    X509SerialNumber = bouncyCert.SerialNumber.ToString()
                }
            };
        }
Вложения
Тип файла: rar ServiceHelperHost.SignLibrary.rar (143.3 Кб, 59 просмотров)
1
16 / 15 / 1
Регистрация: 18.04.2016
Сообщений: 82
02.03.2020, 07:41
Umatkot_Primtep, спасибо. Попробую - отпишусь.
Задал вопрос Контура ( кто ключи делает) , посмотрим, что ответят...

Добавлено через 1 час 12 минут
Проверил. В нерабочем варианте как раз вызывалась IssuerNamePatcher()
Закомментировал - все заработало.
0
0 / 0 / 0
Регистрация: 24.01.2020
Сообщений: 10
02.03.2020, 13:28
Umatkot_Primtep, Пасиб, сделал .. ошибка формата
0
16 / 15 / 1
Регистрация: 18.04.2016
Сообщений: 82
03.03.2020, 06:27
hantik, Вот версия с закомментированым IssuerNamePatcher(), как советовал Umatkot_Primtep.
Не забудь в app.config поменять ссылку на свой сертификат

clientCertificate findValue="150f0fff9ae7afd2fa4a9b74a78de 3e3299f9999"
add key="certificate-thumbprint" value="150f0fff9ae7afd2fa4a9b74a78de3e32 99f9999"

и указать свой orgPPAGUID
Вложения
Тип файла: rar SimpleGis12_02032020.rar (7.22 Мб, 133 просмотров)
2
0 / 0 / 0
Регистрация: 24.01.2020
Сообщений: 10
03.03.2020, 08:26
Цитата Сообщение от foxwizard Посмотреть сообщение
hantik, Вот версия с закомментированым IssuerNamePatcher(), как советовал Umatkot_Primtep.
Не забудь в app.config поменять ссылку на свой сертификат

clientCertificate findValue="150f0fff9ae7afd2fa4a9b74a78de 3e3299f9999"
add key="certificate-thumbprint" value="150f0fff9ae7afd2fa4a9b74a78de3e32 99f9999"

и указать свой orgPPAGUID
Я уже это давно пробовал ..кучу вариантов перепробовал, хорошо, спасибо посмотрю и этот.
0
1 / 1 / 0
Регистрация: 15.02.2019
Сообщений: 7
20.04.2020, 16:25
Цитата Сообщение от Umatkot_Primtep Посмотреть сообщение
По ней делаешь GET STATE
Нужно ли подписывать getState-запрос?
И еще вопрос, у меня подпись постоянно меняется при одних и тех же исходных данных, она же не должна менятся?
0
17 / 17 / 0
Регистрация: 26.02.2013
Сообщений: 506
20.04.2020, 17:13
Цитата Сообщение от nabi2008 Посмотреть сообщение
Нужно ли подписывать getState-запрос?
И еще вопрос, у меня подпись постоянно меняется при одних и тех же исходных данных, она же не должна менятся?
1.Не нужно
2.Подпись всегда разная !
0
187 / 100 / 19
Регистрация: 15.09.2011
Сообщений: 801
21.04.2020, 02:11
nabi2008, GetState запрос можно получить попробовать от другой организации, зная его Guid.

Подпись меняется даже если ты один и тот же запрос отправляешь. Она там ставит временную метку и потом с неё считает хэш + подпись.
0
1 / 1 / 0
Регистрация: 15.02.2019
Сообщений: 7
21.04.2020, 14:02
BVladimir2, Umatkot_Primtep, спасибо за ответ.
Не подскажете ли что в запросе не так:
Кликните здесь для просмотра всего текста
XML
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
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header>
<NS1:ISRequestHeader xmlns:NS1="http://dom.gosuslugi.ru/schema/integration/base/">
<NS1:Date>2020-04-20T14:21:34.916+03:00</NS1:Date>
<NS1:MessageGUID>0552a911-82a8-4b60-a733-29ec3b2c3c1a</NS1:MessageGUID>
</NS1:ISRequestHeader>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<exportOrgRegistryRequest xmlns="http://dom.gosuslugi.ru/schema/integration/organizations-registry-common/" xmlns:NS1="http://dom.gosuslugi.ru/schema/integration/base/" Id="signed-data-container" NS1:version="10.0.2.1">
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="xmldsig-9982c76b-a56c-4555-a8ec-b521844dc241">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"></ds:CanonicalizationMethod>
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411"></ds:SignatureMethod>
<ds:Reference Id="xmldsig-9982c76b-a56c-4555-a8ec-b521844dc241-ref0" URI="#signed-data-container">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"></ds:Transform>
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></ds:Transform>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411"></ds:DigestMethod>
<ds:DigestValue>sviJ7sXy75aXltFLTO7//oyYYDIPflwowJmmk3rlC18=</ds:DigestValue>
</ds:Reference>
<ds:Reference Type="http://uri.etsi.org/01903#SignedProperties" URI="#xmldsig-9982c76b-a56c-4555-a8ec-b521844dc241-signedprops">
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411"></ds:DigestMethod>
<ds:DigestValue>oCqOhbKsRbwGnviBtsJjqbode4QKEViBx/MTtR/STgE=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue Id="xmldsig-9982c76b-a56c-4555-a8ec-b521844dc241-sigvalue">
te+IUb9YE7w4SuRzLc4eB3ZiYMQJ9EHQHYXCfDgyLkx5U+A63/MaoFDcpR8gaTQeonXhnA9hOmX7
u8mnvE36QA==
</ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>
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
</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
<ds:Object>
<xades:QualifyingProperties xmlns:xades="http://uri.etsi.org/01903/v1.3.2#" Target="#xmldsig-9982c76b-a56c-4555-a8ec-b521844dc241">
<xades:SignedProperties Id="xmldsig-9982c76b-a56c-4555-a8ec-b521844dc241-signedprops">
<xades:SignedSignatureProperties><xades:SigningTime>2020-04-15T15:17:17.941+03:00</xades:SigningTime>
<xades:SigningCertificate>
<xades:Cert>
<xades:CertDigest>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411"></ds:DigestMethod>
<ds:DigestValue>GYDIGf/xq4yqJ5qWgWjznxdXdx/uErX3gDNJ7dfRzbU=</ds:DigestValue>
</xades:CertDigest>
<xades:IssuerSerial>
<ds:X509IssuerName>1.2.643.100.1=1024001434049,1.2.643.3.131.1.1=004029017981,STREET=переулок Теренинский\, д.6,C=RU,L=г.Калуга,ST=40 Калужская область,1.2.840.113549.1.9.1=ca@astral.ru,O=АО \"КАЛУГА АСТРАЛ\",CN=АО \"КАЛУГА АСТРАЛ\"</ds:X509IssuerName>
<ds:X509SerialNumber>2436430578848076824197612753878384641</ds:X509SerialNumber>
</xades:IssuerSerial>
</xades:Cert>
</xades:SigningCertificate>
</xades:SignedSignatureProperties>
</xades:SignedProperties>
</xades:QualifyingProperties>
</ds:Object>
</ds:Signature>
<SearchCriteria>
<OGRN xmlns="http://dom.gosuslugi.ru/schema/integration/organizations-base/">1060545002539</OGRN>
</SearchCriteria>
</exportOrgRegistryRequest>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Получаю ошибку формата подписи.
Прогнал сертификат из ответа через свою хеш-фунцию, получил такой же хеш. Значит функция хеширования у меня правильно работает.
Делал тоже самое с тегом SignedProperties, хешировал как есть, с форматированием, без пробелов и табуляции, не смог получить хеш как в ответе. Я так понимаю в ГИС ЖКХ мои хеши при проверке не сходятся.
Еще вопрос по поставщику сертификата. CryptoPro CSP его отображает так
ОГРН=1024001434049, STREET="переулок Теренинский, д. 6", ИНН=004029017981, C=RU, L=г. Калуга, S=40 Калужская область, E=ca@astral.ru, O="АО ""КАЛУГА АСТРАЛ""", CN="АО ""КАЛУГА АСТРАЛ"""
через CriptoAPI получаю в таком виде
1.2.643.100.1=1024001434049, STREET="переулок Теренинский, д. 6", 1.2.643.3.131.1.1=004029017981, C=RU, L=г. Калуга, S=40 Калужская область, 1.2.840.113549.1.9.1=ca@astral.ru, O="АО ""КАЛУГА АСТРАЛ""", CN="АО ""КАЛУГА АСТРАЛ"""
пробовал с экранированием
1.2.643.100.1=1024001434049,1.2.643.3.13 1.1.1=004029017981,STREET=переулок Теренинский\, д.6,C=RU,L=г.Калуга,ST=40 Калужская область,1.2.840.113549.1.9.1=ca@astral.r u,O=АО "КАЛУГА АСТРАЛ",CN=АО "КАЛУГА АСТРАЛ"
В каком виде вы его отправляете?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.04.2020, 14:02

Интеграция с ГИС ЖКХ. Подпись SOAP и защита канала по ГОСТ (3)
Предыдущая тема: https://www.cyberforum.ru/web-services-wcf/thread1776736.html Кто нибудь знает откуда брать справочники NsiRef по...

Интеграция с ГИС ЖКХ. Подпись SOAP и защита канала по ГОСТ
Здравствуйте! Передо мной стоит задача интеграции с системой ГИС ЖКХ (https://dom.gosuslugi.ru/) программой, написанной на языке...

Осуществить подпись SOAP, по стандартам ГИС ГМП, принятого через TCP сокет
Здравствуйте. Требуется осуществить подпись SOAP, по стандартам ГИС ГМП, принятого через тсп сокет. Со второй частью все понятно, а вот с...

Ошибки интеграции ГИС ЖКХ
Я много тут читал форум по интеграции ГИС. На старте, впрочем, как и в последствии возникает много траблов с интеграцией. Есть идея вынести...

Soap, Java, Гис ЖКХ
Добрый день! Имеет ли кто опыт работы с soap в Java? Поставлена задача наладить работу с ГИС ЖКХ, До этого не работал с SOAP, почитал все...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
220
Ответ Создать тему
Новые блоги и статьи
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru