Форум программистов, компьютерный форум, киберфорум
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. Показов 110968. Ответов 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
 Аватар для hhmm
67 / 58 / 1
Регистрация: 01.04.2016
Сообщений: 346
01.10.2018, 10:10  [ТС]
Студворк — интернет-сервис помощи студентам
Форум вроде как глючит, когда добавлялась ссылка на первую страницу - всё скачивалось.
0
2 / 2 / 0
Регистрация: 24.03.2016
Сообщений: 7
05.10.2018, 11:13
Добрый день всем, Я дико извиняюсь, может я чего-то недопонимаю. В шапке можно скачать только дополнения, а саму куклу от уважаемого Hhmm не вижу.
0
 Аватар для hhmm
67 / 58 / 1
Регистрация: 01.04.2016
Сообщений: 346
05.10.2018, 11:17  [ТС]
Цитата Сообщение от Atma1 Посмотреть сообщение
Добрый день всем, Я дико извиняюсь, может я чего-то недопонимаю. В шапке можно скачать только дополнения, а саму куклу от уважаемого Hhmm не вижу
Раздел Вложения внизу шапки

Цитата Сообщение от hhmm Посмотреть сообщение
GisBusted.zip (4.17 Мб, 130 просмотров)
1
2 / 2 / 0
Регистрация: 24.03.2016
Сообщений: 7
24.10.2018, 10:10
Большое спасибо уважаемым hhmm, umatkot и остальным форумчанам. На промышленном стенде удалось настроить куклу от umatkot и hhmm. Си шарп для меня новый язык, поэтому может показаться мой вопрос глупым. Пытаюсь настроить на работу с СИТ01 в файле конфигурации от umatkot в пароле на basic авторизацию присутствуют символы "&&". Как их использовать в строке, чтобы ошибку не выдавало?
0
187 / 100 / 19
Регистрация: 15.09.2011
Сообщений: 801
24.10.2018, 10:21
Atma1, там надо задавать экранирование
<add key="basic_password" value="xw{p&amp;&amp;Ee3b9r8?amJv*]" />

&& = &amp;&amp; в конфиге.
1
187 / 100 / 19
Регистрация: 15.09.2011
Сообщений: 801
29.10.2018, 04:59
Ну что сказать про GisFileClient? Простенько, только не захотел WebClient устанавливать защищённое соединение без проксика. Если я ставлю Fiddler как проксик, то Fiddler без проблем "братается" с серваком, а вот WebClient оказался упорным и я не смог указать сертификат для рукопожатия. Я добавлял его вот так
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
protected override WebRequest GetWebRequest(Uri address)
        {
            var baseRequest = (HttpWebRequest)base.GetWebRequest(address);
            baseRequest.ClientCertificates.Add(GisSignatureHelper.GetCertificate2());
            baseRequest.Date = DateTime.Now;
            baseRequest.KeepAlive = true;
            return base.GetWebRequest(address);
        }
, но всё равно - не хочет и всё.

Пришлось использовать HttpClient - он смог сделать рукопожатие и файл разместился.
Вот кусок кода вставки файла на сервер
Кликните здесь для просмотра всего текста
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
public class GisServiceUtil : FileUtil
    {
        public void PutFile(string fileName)
        {
            var filePath = @"C:\servicehelperhost\store\homemanagement\upload\";
            var rr = new FileInfo(filePath + fileName);
            var culture = new CultureInfo("en-US");
            var today = DateTime.Now.ToString("ddd,' 'dd' 'MMM' 'yyyy' 'HH':'mm':'ss' 'K", culture);
 
            //const string yourUrl = "https://217.107.108.156:10081";
            const string path = "homemanagement";
 
            var cert = GisSignatureHelper.GetCertificate2();
 
            var wrHandler = new WebRequestHandler
            {
                Proxy = new WebProxy("http://localhost:3128"),
                UseProxy = false,
                ClientCertificateOptions = ClientCertificateOption.Manual
            };
 
            wrHandler.ClientCertificates.Add(cert);
 
            //wrHandler.Proxy.Credentials = GetMyNetworkCredential();
 
            //Console.WriteLine(yourUrl);
 
            using (var client = new HttpClient(wrHandler))
            {
                var bytes = File.ReadAllBytes(filePath + fileName);
                using (var content = new ByteArrayContent(bytes))
                {
                    var lnn = bytes.Length;
 
                    var md5 = GetMD5Hash(bytes);
 
                    content.Headers.Add("Content-MD5", md5);
                    content.Headers.ContentLength = lnn;
 
                    using (var req = new HttpRequestMessage(HttpMethod.Put,
                        $"https://217.107.108.116:443/ext-bus-file-store-service/rest/{path}/"))
                    {
                        req.Version = HttpVersion.Version11;
 
                        req.Headers.Add("Date", today);
                        req.Headers.Add("X-Upload-OrgPPAGUID", new Guid("e682967a-c81e-4883-aa90-0bb0bb34fbeb").ToString());
                        req.Headers.Add("X-Upload-Filename", fileName);
                                                
                        req.Content = content;
 
                        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
                        ServicePointManager.CheckCertificateRevocationList = false;
                        ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true;
 
                        ServicePointManager.Expect100Continue = false;
 
                        var resp = client.SendAsync(req).ContinueWith(getTask =>
                        {
                            if (getTask.IsCanceled)
                            {
                                Console.WriteLine("Request was canceled");
                                return;
                            }
 
                            if (getTask.IsFaulted)
                            {
                                Console.WriteLine("Request failed " + getTask.Exception);
                                return;
                            }
 
                            var response = (HttpResponseMessage)getTask.Result;
 
                            foreach (var header in response.Headers)
                            {
                                Console.WriteLine($"{header.Key}: {header.Value.First()}");
                            }
 
                            Console.WriteLine("Request complete with status code " + response.StatusCode);
                        });
 
                        resp.Wait();
 
                    }
                }
            }
        }
    }
1
7 / 7 / 0
Регистрация: 21.04.2017
Сообщений: 36
29.10.2018, 08:27
А файл с клиентом(GisFileClient_v2.zip), так и качается с ошибкой. Может кто разместит заново? Спасибо.
0
187 / 100 / 19
Регистрация: 15.09.2011
Сообщений: 801
29.10.2018, 08:36
anton_hz, да там, особо то и нечего смотреть. Первая версия, пишу же, работает только с проксиком, когда тема у нас как раз - управиться без криптотуннелей (по-сути мусора.) Если уж и не найдём выход, а он есть и я им пользуюсь (правда как, ещё не понял окончательно), то только в бесплатном ядре https://www.telerik.com/fiddler/fiddlercore
1
2 / 2 / 0
Регистрация: 24.03.2016
Сообщений: 7
01.11.2018, 08:05
Добрый день, уважаемые форумчане. Решил поделиться радостью, сегодня создал первый лицевой счет при помощи куклы от umatkot, за что ему большое спасибо. Запросы формирую из 1С, кукла берет файл и подписывает отправляет запрос и получает результат, результат обрабатываю в 1С. Пока работал только синхронными запросами. Все делал на промышленном стенде. Криптопровайдер - КриптоПро CSP. Для просмотра XSD схем использую oXygen XML Editor - очень наглядно в графическом виде отображает схему, рекомендую.
1
187 / 100 / 19
Регистрация: 15.09.2011
Сообщений: 801
03.11.2018, 18:58
hhmm, вообще бы не плохо было бы нам сделать альтернативу на подобии SmartBear

Добавлено через 57 секунд
hhmm, Я ковырял либы от микросов - они там тупо заглушки поставили

Добавлено через 49 секунд
что с форумом нафик?

Добавлено через 1 минуту
Atma1, не надо благодарностей, я тоже учился у братков. Просто если использовалась моя тупая кукла, то спасибо должно быть не сильно большим.
0
2 / 2 / 0
Регистрация: 24.03.2016
Сообщений: 7
08.11.2018, 08:27
Доброго времени суток всем! Сегодня пытался запустить куклу на сервере win 2016, при включенном UAC. Выдает ошибку:
Приложение: GisServ.exe
Версия платформы: v4.0.30319
Описание. Процесс был завершен из-за необработанного исключения.
Сведения об исключении: System.Exception
в SignLibrary.Gis.GisSignatureHelper.FindC ertificate()
в SignLibrary.Gis.GisSignatureHelper.GetCe rtificate2()
в GisServiceTest.Program.SetupRequest(Syst em.Net.HttpWebRequest)
в GisServiceTest.Program.Main(System.Strin g[])

Права дал на учетку от имени которой запускается приложение и крипто про. Похоже UAC мешает, однако совсем его отключать не хотелось бы. Кто сталкивался с такой проблемой?
0
187 / 100 / 19
Регистрация: 15.09.2011
Сообщений: 801
10.11.2018, 12:04
Atma1, смотря где находится сам сертификат - в пользователях или в системе?

Добавлено через 1 минуту
Если в системе, то нужно там дать права на хранилище конкретному пользователю. В пользователях не проверял работоспособность. Надо уточнить, в чём именно ошибка. Походу-к доступу к контейнеру закрытого ключа, если он в системе.

Добавлено через 8 минут
Цитата Сообщение от Atma1 Посмотреть сообщение
при включенном UAC
вообще такие вещи надо тестить отдельно. На серваке, на котором крутятся сервисы нам эти UAC не особо то и требуются....

Добавлено через 8 минут
основной способ-вот тут описан

Добавлено через 19 секунд
Как предоставить ASP.NET доступ к закрытому ключу в сертификате в хранилище сертификатов
0
2 / 2 / 0
Регистрация: 24.03.2016
Сообщений: 7
12.11.2018, 09:22
umatkot, Спасибо, был в пользователях, перенес в систему - заработало. Видать с пользователем есть какие-то тонкости.
1
4 / 4 / 0
Регистрация: 21.04.2015
Сообщений: 45
13.03.2019, 02:00
Всем привет.

Не могу подписать запрос ЭЦП с алгоритмом ГОСТ Р 34.10-2012 256 бит. Подскажите в какую сторону двигаться, чтобы решить эту проблему? Ни у кого нет реализации данного функционала?
0
16 / 15 / 1
Регистрация: 18.04.2016
Сообщений: 82
13.03.2019, 06:30
Цитата Сообщение от daniel_tlk Посмотреть сообщение
Не могу подписать запрос ЭЦП с алгоритмом ГОСТ Р 34.10-2012 256 бит
А смысл? ГИС не работает с ключами 2012

Добавлено через 4 минуты
Продублирую свой вопрос:

Столкнулся с проблемой.
Столкнулся с проблемой.
Есть ключ для ГИС (Гост 2001), действующий.
Не могу им подписать.
При выполнении
C#
1
 m_signature.SignatureValue = description.CreateFormatter(SigningKey).CreateSignature(hash);
Получаю ошибку выполнении функции.
C#
1
2
3
4
5
6
7
public new void ComputeSignature()
        {
            //base.ComputeSignature();
            HashAlgorithm hash;
            var description = GetSignedInfoHash(out hash);
            m_signature.SignatureValue = description.CreateFormatter(SigningKey).CreateSignature(hash);
        }
С другими ключами все ОК.
Ключи немного разные внутри...

У проблемного
PrivateKey = 'certificate.PrivateKey' threw an exception of type 'System.NotSupportedException'

У рабочего
PrivateKey = 'certificate2.PrivateKey' threw an exception of type 'System.NotSupportedException'

Хотя проблемным запросы подписывают через чужой софт (СТЕК ЖКХ). Т.е. ключик нормальный....
0
4 / 4 / 0
Регистрация: 21.04.2015
Сообщений: 45
13.03.2019, 06:53
Цитата Сообщение от foxwizard Посмотреть сообщение
А смысл?
Смысл сделать задел на будущее.
0
187 / 100 / 19
Регистрация: 15.09.2011
Сообщений: 801
02.04.2019, 10:49
Цитата Сообщение от hhmm Посмотреть сообщение
то ли ViPNet CSP не может внедриться на транспортном уровне
вот это как раз можно попробовать и проверить через csptest и openssl - они железно должны видеть контейнеры с сертификатами(на счёт последнего немного сомневаюсь(не пробовал 2012 GOST), так как, возможно там ещё нет поддержки GOST2012) и осуществлять рукопожатие с сервером ГИС ЖКХ.
Цитата Сообщение от daniel_tlk Посмотреть сообщение
Смысл сделать задел на будущее.
Чувствуется, что да, задел нам на будущее потребуется, тогда уже точно будем дорабатывать свои либы и проверять рукопожатия.
0
16 / 15 / 1
Регистрация: 18.04.2016
Сообщений: 82
03.04.2019, 15:08
daniel_tlk, Получилось?
0
4 / 4 / 0
Регистрация: 21.04.2015
Сообщений: 45
04.04.2019, 01:16
foxwizard, пока занят и не до этого. Но в другой теме мне дали наводку, можете посмотреть. Сам еще ничего не проверял.
0
16 / 15 / 1
Регистрация: 18.04.2016
Сообщений: 82
04.04.2019, 06:19
Я пользовался SignLibrary из этого поста.
Но, чую, сам не допилю до нового госта. Не мой профиль..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.04.2019, 06:19

Интеграция с ГИС ЖКХ. Подпись 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, почитал все...


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

Или воспользуйтесь поиском по форуму:
160
Ответ Создать тему
Новые блоги и статьи
Установка 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