Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Веб-сервисы и WCF
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.82/88: Рейтинг темы: голосов - 88, средняя оценка - 4.82
hhmm
55 / 55 / 0
Регистрация: 01.04.2016
Сообщений: 335
1

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

06.04.2017, 22:27. Просмотров 15946. Ответов 167

Решил создать отдельную тему, так как в теме Интеграция с ГИС ЖКХ. Подпись 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 предложил набор классов реализующих работу в ГИС ЖКХ файловых сервисов.
8
Вложения
Тип файла: zip GisBusted.zip (4.17 Мб, 192 просмотров)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.04.2017, 22:27
Ответы с готовыми решениями:

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

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

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

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

Интеграция с ГИС ЖКХ. Подпись SOAP и защита канала по ГОСТ
Здравствуйте! Передо мной стоит задача интеграции с системой ГИС ЖКХ...

167
foxwizard
3 / 3 / 0
Регистрация: 18.04.2016
Сообщений: 52
04.04.2019, 14:56 161
Я починил.
В SignLibrary из Nuget обновил GostCryptography и BouncyCastle.Crypto
Кое что подправил методом тыка и взлетело.
1
Вложения
Тип файла: rar SignLibrary.rar (2.14 Мб, 24 просмотров)
foxwizard
3 / 3 / 0
Регистрация: 18.04.2016
Сообщений: 52
04.04.2019, 14:57 162
Я починил.
В SignLibrary из Nuget обновил GostCryptography и BouncyCastle.Crypto
Кое что подправил методом тыка и взлетело.
0
foxwizard
3 / 3 / 0
Регистрация: 18.04.2016
Сообщений: 52
05.04.2019, 14:12 163
Пример подписанного запроса
0
Вложения
Тип файла: zip foo.zip (3.5 Кб, 34 просмотров)
Umatkot_Primtep
94 / 78 / 18
Регистрация: 29.04.2016
Сообщений: 313
21.06.2019, 05:32 164
Изменённая, адаптивная либа для GOST 2012 и старого алгоритма. Уже есть - но эта работает 100% без переделок.
0
Вложения
Тип файла: rar ServiceHelperHost.SignLibrary.rar (143.1 Кб, 15 просмотров)
21.06.2019, 05:32
anton_hz
4 / 4 / 0
Регистрация: 21.04.2017
Сообщений: 23
Вчера, 08:09 165
Уважаемые коллеги!
Кто может подсказать в чем дело.
Пытаюсь обновить перечень лицевых счетов для индивидуального прибора учета. Использую сервис HouseManagementServiceAsync и его метод importMeteringDeviceData. Однако сервер не хочет принимать запрос"Удаленный сервер возвратил ошибку: (400) Недопустимый запрос."
Сообщение:
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
<?xml version="1.0" encoding="utf-16"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Header>
        <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">urn:importMeteringDeviceData</Action>
        <h:RequestHeader xmlns="http://dom.gosuslugi.ru/schema/integration/base/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://dom.gosuslugi.ru/schema/integration/base/">
            <Date>2019-07-02T15:56:57.3784794+04:00</Date>
            <MessageGUID>2de57d01-c58d-4dc2-8b88-efa50c10abab</MessageGUID>
            <orgPPAGUID>37d276d6-e854-4c03-9bb7-187c97af3269</orgPPAGUID>
            <IsOperatorSignature>true</IsOperatorSignature>
        </h:RequestHeader>
    </s:Header>
    <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <importMeteringDeviceDataRequest Id="signed-data-container" d3p1:version="11.1.0.8" xmlns:d3p1="http://dom.gosuslugi.ru/schema/integration/base/" xmlns="http://dom.gosuslugi.ru/schema/integration/house-management/">
            <FIASHouseGuid>4e6fe615-d8eb-4e2b-82c0-b665f55dd7fb</FIASHouseGuid>
            <MeteringDevice>
                <DeviceDataToUpdate>
                    <MeteringDeviceVersionGUID>8f3224c4-4ff6-4680-8d0c-b665ffce04da</MeteringDeviceVersionGUID>
                    <UpdateAfterDevicesValues>
                        <AccountGUID>6aafac5a-a153-4f2a-a595-ff526e19fc1b</AccountGUID>
                    </UpdateAfterDevicesValues>
                </DeviceDataToUpdate>
            </MeteringDevice>
            <MeteringDevice>
                <DeviceDataToUpdate>
                    <MeteringDeviceVersionGUID>ae5b780b-8ae6-4466-b5b5-8e77373df538</MeteringDeviceVersionGUID>
                    <UpdateAfterDevicesValues>
                        <AccountGUID>6aafac5a-a153-4f2a-a595-ff526e19fc1b</AccountGUID>
                    </UpdateAfterDevicesValues>
                </DeviceDataToUpdate>
            </MeteringDevice>
        </importMeteringDeviceDataRequest>
    </s:Body>
</s:Envelope>
Техподдержка по тихому слила вопрос и перестала отвечать.
Чудо софтина основанная на кукле выдает следующее сообщение:

System.ServiceModel.ProtocolException: Удаленный сервер вернул неожиданный ответ: (400) Bad Request. ---> System.Net.WebException: Удаленный сервер возвратил ошибку: (400) Недопустимый запрос.
в System.Net.HttpWebRequest.GetResponse()
в System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
--- Конец трассировки внутреннего стека исключений ---

Server stack trace:
в System.ServiceModel.Channels.HttpChannelUtilities.ValidateRequestReplyResponse(HttpWebRequest request, HttpWebResponse response, HttpChannelFactory`1 factory, WebException responseException, ChannelBinding channelBinding)
в System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
в System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout)
в System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout)
в System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
в System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
в System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

Exception rethrown at [0]:
в System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
в System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
в GisBustedWsdlWrapper.HouseManagementPortsTypeAsync.importMeteringDeviceData(importMeteringDeviceDataRequest1 request)
в GisBustedWsdlWrapper.HouseManagementPortsTypeAsyncClient.GisBustedWsdlWrapper.HouseManagementPortsTypeAsync.importMeteri ngDeviceData(importMeteringDeviceDataRequest1 request) в D:\GIS\GBv3\WSDL\GisBustedWsdlWrapper.cs:строка 129010
в GisBustedWsdlWrapper.HouseManagementPortsTypeAsyncClient.importMeteringDeviceData(RequestHeader RequestHeader, importMeteringDeviceDataRequest importMeteringDeviceDataRequest, AckRequest& AckRequest) в D:\GIS\GBv3\WSDL\GisBustedWsdlWrapper.cs:строка 129018
в GisBusted.Workers.house_managment_async.HouseManagementServiceAsyncWorker.ImportMeteringDeviceData(String FIASHouseGuid, importMeteringDeviceDataRequestMeteringDevice[] meteringDevices, String& MessageGUID, Exception& Error) в D:\GIS\GBv3\Workers\house-managment-async\HouseManagementServiceAsyncWorker.cs:строка 159
0
Umatkot_Primtep
94 / 78 / 18
Регистрация: 29.04.2016
Сообщений: 313
Вчера, 08:31 166
anton_hz, Возможно там такой подход - архивирование ПУ старого и создание нового с требуемыми лицевыми.

Добавлено через 7 минут
anton_hz, даже если есть показания, думаю, что ничего страшного не случится, если прибор удалить, добавить новый и накатить все показания. Там, в документации указывается, что нужно все данные передавать, не только AccountGuid - это больше мороки чем тупо новый создать.
Да, так кстати везде по обновлениям - вообще, это косяк ГИС, что требует все данные в целостности, а не обновляет только одно поле - мы с этим "супералгоритмом обновления" ещё пару лет назад познакомились и уже тогда их прокляли) В тот конструктор, что вы обновить пытаетесь, можно играть очень долго, чтобы убедиться, какие поля требуются, а какие - нет.
0
anton_hz
4 / 4 / 0
Регистрация: 21.04.2017
Сообщений: 23
Вчера, 09:04 167
По документации на тип "MeteringDeviceToUpdateAfterDevicesValuesType" вроде все сходится там почте все поля
в количестве 0...1. Теоретически должно все работать. И тех. поддержка написала
"Для продолжения работы по Вашему обращению просим уточнить актуальность проблемы на текущий момент.
Если проблема сохраняется, то просьба приложить к ответному письму все запросы и ответы (изначальный запрос, AckRequest, getStateRequest, ответ с ошибкой), а также заголовки и и URL сервиса данных запросов и адреса отправления запросов."
Это они что-то типа сделали, проверьте. Но кода я им завинтил что запрос вообще не принимается системой, и что речи не может быть про AckRequest, getStateRequest. Они слились.
В последнее время у всех проблемы с тех. поддержкой или я один такой?
0
umatkot
68 / 67 / 5
Регистрация: 15.09.2011
Сообщений: 420
Завершенные тесты: 1
Вчера, 10:33 168
anton_hz, им надо звонить и уточнять статус обращения мотивируя их тем, что сейчас за спиной у вас стоит голодный и злой директор - что-то в этом роде - долбить их до бесконечности, пока не решат проблему и не помогут. Да, я видел по полям, возможно, так и есть, но если проходит один запрос (проверьте тоже самое, только архивируйте тестовый счётчик на ППАК и также можно проверить, как реагирует более продвинутый СИТ 2) - они сначала на СИТ 2 всё обновляют, потом на ППАК и СИТ 1
1
Вчера, 10:33
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
Вчера, 10:33

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

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

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


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

Или воспользуйтесь поиском по форуму:
168
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru