Форум программистов, компьютерный форум, киберфорум
C#: Веб-сервисы, WCF
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.61/847: Рейтинг темы: голосов - 847, средняя оценка - 4.61
1 / 1 / 0
Регистрация: 16.12.2015
Сообщений: 1
.NET 4.x

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

16.12.2015, 11:46. Показов 173864. Ответов 999

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Передо мной стоит задача интеграции с системой ГИС ЖКХ (https://dom.gosuslugi.ru/) программой, написанной на языке C#, .NET Framework 4
Данный сервис предоставляет SOAP веб-сервисы для приема и передачи информации, соединение защищается сертификатом по алгоритму ГОСТ. Каждый элемент внутри тела SOAP сообщения подписывается сигнатурой XAdES-BES.
На данный момент для осуществления защищённого соединения я использую «МагПро КриптоТуннель» (stunnel) со следующими настройками:
Конфигурация stunnel (stunnel.conf)
verify=2
client=yes
CAFile=CA-test2-cryptopro.pem
engine=gost
usb_eject=yes
sslVersion=TLSv1
taskbar=yes
DEBUG=7

[pseudo-https]
protocol = http
accept = 127.0.0.1:8754
connect = 54.76.42.99:60045
ciphers = GOST2001-GOST89-GOST89
TIMEOUTclose = 0
cert=test.pem
key=test.key

Для обмена SOAP сообщениями я использую стандартный сервис WCF с прокси-классами, сгенерированные из WSDL файлов. Для подписи SOAP сообщений сигнатурой использую ниже представленный класс:
C#. Класс для подписи исходного SOAP сообщения
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
class ServiceClientBehavior : IEndpointBehavior, IClientMessageInspector
{
    public object BeforeSendRequest(ref Message request, IClientChannel channel)
    {
        XmlDocument doc = new XmlDocument();
        MemoryStream ms = new MemoryStream();
        XmlWriter writer = XmlWriter.Create(ms);
        request.WriteMessage(writer);
        writer.Flush();
        ms.Position = 0;
        doc.Load(ms);
        
        SignXml(doc);
        
        ms.SetLength(0);
        writer = XmlWriter.Create(ms);
        doc.WriteTo(writer);
        writer.Flush();
        ms.Position = 0;
        XmlReader reader = XmlReader.Create(ms);
        request = Message.CreateMessage(reader, int.MaxValue, request.Version);
 
        return null;
    }
    
    void SignXml(XmlDocument doc)
    {
        doc.PreserveWhitespace = true;
 
        // Получение элемента из тела сообщения
        var requestNode = doc.DocumentElement.ChildNodes[1].ChildNodes[0];
        var signRequestNode = SignRequest(requestNode);
 
        var body = requestNode.ParentNode;
        body.RemoveChild(requestNode);
        body.AppendChild(signRequestNode);
    }
    XmlNode SignRequest(XmlNode reqNode)
    {
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.PreserveWhitespace = true;
        xmlDoc.AppendChild(xmlDoc.ImportNode(reqNode, true));
 
        var signedXml = new SignedXML(xmlDoc);
        signedXml.SigningKey = certificate.PrivateKey;
 
        KeyInfo keyInfo = new KeyInfo();
        keyInfo.AddClause(new KeyInfoX509Data(certificate));
        signedXml.KeyInfo = keyInfo;
 
        signedXml.Signature.Id = "SignatureId";
 
        #region Создание DataObject
        {
            XmlElement SignaturePropertiesRoot;
            XmlElement QualifyingPropertiesRoot;
            string xadesURI = "http://uri.etsi.org/01903/v1.3.2#";
            string dsURI = "http://www.w3.org/2000/09/xmldsig#";
 
            QualifyingPropertiesRoot = xmlDoc.CreateElement("xades", "QualifyingProperties", xadesURI);
            QualifyingPropertiesRoot.SetAttribute("Target", "#SignatureId");
 
            SignaturePropertiesRoot = xmlDoc.CreateElement("xades", "SignedProperties", xadesURI);
            SignaturePropertiesRoot.SetAttribute("Id", "SignedPropertiesId");
 
            XmlElement SignedSignatureProperties = xmlDoc.CreateElement("xades", "SignedSignatureProperties", xadesURI);
 
            XmlElement timestamp = xmlDoc.CreateElement("xades", "SigningTime", xadesURI);
            timestamp.InnerText = XmlConvert.ToString(DateTimeOffset.Now);
            SignedSignatureProperties.AppendChild(timestamp);
 
            XmlElement SigningCertificate = xmlDoc.CreateElement("xades", "SigningCertificate", xadesURI);
            XmlElement Cert = xmlDoc.CreateElement("xades", "Cert", xadesURI);
            XmlElement CertDigest = xmlDoc.CreateElement("xades", "CertDigest", xadesURI);
 
            XmlElement DigestMethod = xmlDoc.CreateElement("ds", "DigestMethod", dsURI); DigestMethod.SetAttribute("Algorithm", "http://www.w3.org/2001/04/xmldsig-more#gostr3411");
            XmlElement DigestValue = xmlDoc.CreateElement("ds", "DigestValue", dsURI); DigestValue.InnerText = ComputeGostHash(this.ClientCertificate.RawData);
            CertDigest.AppendChild(DigestMethod);
            CertDigest.AppendChild(DigestValue);
            Cert.AppendChild(CertDigest);
 
            XmlElement IssuerSerial = xmlDoc.CreateElement("xades", "IssuerSerial", xadesURI);
            XmlElement X509IssuerName = xmlDoc.CreateElement("ds", "X509IssuerName", dsURI); X509IssuerName.InnerText = GetIssuerName(certificate);
            XmlElement X509SerialNumber = xmlDoc.CreateElement("ds", "X509SerialNumber", dsURI); X509SerialNumber.InnerText = GetSerialNumber(certificate);
            IssuerSerial.AppendChild(X509IssuerName);
            IssuerSerial.AppendChild(X509SerialNumber);
            Cert.AppendChild(IssuerSerial);
 
            SigningCertificate.AppendChild(Cert);
            SignedSignatureProperties.AppendChild(SigningCertificate);
 
            SignaturePropertiesRoot.AppendChild(SignedSignatureProperties);
            QualifyingPropertiesRoot.AppendChild(SignaturePropertiesRoot);
            DataObject dataObject = new DataObject
            {
                Data = QualifyingPropertiesRoot.SelectNodes("."),
            };
            signedXml.AddObject(dataObject);
        }
        #endregion
 
        signedXml.SignedInfo.SignatureMethod = "http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411";
        signedXml.SignedInfo.CanonicalizationMethod = "http://www.w3.org/TR/2001/REC-xml-c14n-20010315";
 
        var reference = new Reference();
        reference.Uri = "#RequestId";
        reference.DigestMethod = "http://www.w3.org/2001/04/xmldsig-more#gostr3411";
        reference.AddTransform(new XmlDsigEnvelopedSignatureTransform());
        reference.AddTransform(new XmlDsigExcC14NTransform());
        signedXml.AddReference(reference);
 
        reference = new Reference();
        reference.Uri = "#SignedPropertiesId";
        reference.DigestMethod = "http://www.w3.org/2001/04/xmldsig-more#gostr3411";
        reference.Type = "http://uri.etsi.org/01903#SignedProperties";
        reference.AddTransform(new XmlDsigEnvelopedSignatureTransform());
        reference.AddTransform(new XmlDsigExcC14NTransform());
        signedXml.AddReference(reference);
 
        signedXml.ComputeSignature();
 
        XmlElement signatureNode = signedXml.GetXml();
        xmlDoc.DocumentElement.PrependChild(xmlDoc.ImportNode(signatureNode, true));
 
        if (!VerifyXml(xmlDoc))
            throw new Exception("Подпись не проходит проверку.");
        return reqNode.OwnerDocument.ImportNode(xmlDoc.DocumentElement, true);
    }
}

В результате после подписи элемента "exportNsiItemRequest" SOAP-сообщение выглядит следующим образом:
XML. Подписанное SOAP сообщение
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
65
<?xml version="1.0" encoding="utf-8"?>
<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:exportNsiItem</Action>
        <h:RequestHeader xmlns="http://dom.gosuslugi.ru/schema/integration/7.1.0.2/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:h="http://dom.gosuslugi.ru/schema/integration/7.1.0.2/">
            <Date>2015-12-16T16:12:47.9885439+10:00</Date>
            <MessageGUID>c7a1d946-9fcf-4ebc-9c08-20ebe81179cf</MessageGUID>
            <SenderID>387142bd-4ff7-4d15-ab09-18b3d99fd9bd</SenderID>
        </h:RequestHeader>
    </s:Header>
    <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <exportNsiItemRequest Id="RequestId" xmlns="http://dom.gosuslugi.ru/schema/integration/7.1.0.2/nsi/">
            <Signature Id="SignatureId" xmlns="http://www.w3.org/2000/09/xmldsig#">
                <SignedInfo>
                    <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
                    <SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411" />
                    <Reference URI="#RequestId">
                        <Transforms>
                            <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
                            <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
                        </Transforms>
                        <DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411" />
                        <DigestValue>fpTlCLCz9/78q4Zpng9eAiCZuaHP51fCXfllN2TeFPw=</DigestValue>
                    </Reference>
                    <Reference URI="#SignedPropertiesId" Type="http://uri.etsi.org/01903#SignedProperties">
                        <Transforms>
                            <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
                            <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
                        </Transforms>
                        <DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411" />
                        <DigestValue>9sBDvpcyxJLVxibQGy280Rz/MlcESescb6k6MEGKreQ=</DigestValue>
                    </Reference>
                </SignedInfo>
                <SignatureValue>...</SignatureValue>
                <KeyInfo>
                    <X509Data>
                        <X509Certificate>...</X509Certificate>
                    </X509Data>
                </KeyInfo>
                <Object>
                    <xades:QualifyingProperties Target="#SignatureId" xmlns:xades="http://uri.etsi.org/01903/v1.3.2#">
                        <xades:SignedProperties Id="SignedPropertiesId">
                            <xades:SignedSignatureProperties>
                                <xades:SigningTime>2015-12-16T16:13:13.4750017+10:00</xades:SigningTime>
                                <xades:SigningCertificate>
                                    <xades:Cert>
                                        <xades:CertDigest>
                                            <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" />
                                            <ds:DigestValue xmlns:ds="http://www.w3.org/2000/09/xmldsig#">B2/4UjEeZwUG0c+mlEfnAZIy8mlbGpkOp4L+jPkgcVY=</ds:DigestValue>
                                        </xades:CertDigest>
                                        <xades:IssuerSerial>
                                            <ds:X509IssuerName xmlns:ds="http://www.w3.org/2000/09/xmldsig#">cn=CRYPTO-PRO Test Center 2,o=CRYPTO-PRO LLC,l=Moscow,c=RU,1.2.840.113549.1.9.1=support@cryptopro.ru</ds:X509IssuerName>
                                            <ds:X509SerialNumber xmlns:ds="http://www.w3.org/2000/09/xmldsig#">401416565317479933092244230678231137456309019</ds:X509SerialNumber>
                                        </xades:IssuerSerial>
                                    </xades:Cert>
                                </xades:SigningCertificate>
                            </xades:SignedSignatureProperties>
                        </xades:SignedProperties>
                    </xades:QualifyingProperties>
                </Object>
            </Signature>
            <RegistryNumber>221</RegistryNumber>
        </exportNsiItemRequest>
    </s:Body>
</s:Envelope>

Проблема заключается в том, что ответ от сервера приходит следующий:
ru.lanit.security.crypto.CryptoException : ЭП не прошла проверку: Invalid XML Signature
Текст ответного сообщения следующий:
XML. SOAP-ответ от сервера
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
<soap:Envelope xmlns:ns2="http://dom.gosuslugi.ru/schema/integration/7.1.0.2/" xmlns:ns3="http://www.w3.org/2000/09/xmldsig#" xmlns:ns5="http://dom.gosuslugi.ru/schema/integration/7.1.0.2/nsi/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Header>
        <ns2:ResultHeader>
            <ns2:Date>2015-12-16T09:14:28.819+03:00</ns2:Date>
            <ns2:MessageGUID>c7a1d946-9fcf-4ebc-9c08-20ebe81179cf</ns2:MessageGUID>
        </ns2:ResultHeader>
    </soap:Header>
    <soap:Body>
        <ns5:exportNsiItemResult Id="signed-data-container">
            <ds:Signature Id="xmldsig-3208628d-03cc-4576-895d-ea6d78b1b6dd" xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
                <ds:SignedInfo>
                    <ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
                    <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411" />
                    <ds:Reference URI="#signed-data-container">
                        <ds:Transforms>
                            <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
                            <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
                        </ds:Transforms>
                        <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411" />
                        <ds:DigestValue>iqCeIlUfsqxdZRuMTjvYKWBTVOtSNrJIYledBG8LrWA=</ds:DigestValue>
                    </ds:Reference>
                    <ds:Reference Type="http://uri.etsi.org/01903#SignedProperties" URI="#xmldsig-3208628d-03cc-4576-895d-ea6d78b1b6dd-signedprops">
                        <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411" />
                        <ds:DigestValue>yASmvpbUBqEPr1Vp+qzYjXhzzXymC9ggqUZZ8GbBVkI=</ds:DigestValue>
                    </ds:Reference>
                </ds:SignedInfo>
                <ds:SignatureValue>...</ds:SignatureValue>
                <ds:KeyInfo>
                    <ds:X509Data>
                        <ds:X509Certificate>...</ds:X509Certificate>
                    </ds:X509Data>
                </ds:KeyInfo>
                <ds:Object>
                    <xades:QualifyingProperties Target="#xmldsig-3208628d-03cc-4576-895d-ea6d78b1b6dd" xmlns:xades="http://uri.etsi.org/01903/v1.3.2#">
                        <xades:SignedProperties Id="xmldsig-3208628d-03cc-4576-895d-ea6d78b1b6dd-signedprops">
                            <xades:SignedSignatureProperties>
                                <xades:SigningTime>2015-12-16T09:14:28.870+03:00</xades:SigningTime>
                                <xades:SigningCertificate>
                                    <xades:Cert>
                                        <xades:CertDigest>
                                            <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411" />
                                            <ds:DigestValue>Sz5+eJyswooXj8h3A5bhMbPG61QPExSKXuw+ZLzyeQ8=</ds:DigestValue>
                                        </xades:CertDigest>
                                        <xades:IssuerSerial>
                                            <ds:X509IssuerName>cn=CRYPTO-PRO Test Center 2,o=CRYPTO-PRO LLC,l=Moscow,c=RU,1.2.840.113549.1.9.1=support@cryptopro.ru</ds:X509IssuerName>
                                            <ds:X509SerialNumber>401416477754091206680439394611221196150735163</ds:X509SerialNumber>
                                        </xades:IssuerSerial>
                                    </xades:Cert>
                                </xades:SigningCertificate>
                            </xades:SignedSignatureProperties>
                        </xades:SignedProperties>
                    </xades:QualifyingProperties>
                </ds:Object>
            </ds:Signature>
            <ns2:ErrorMessage>
                <ns2:ErrorCode>AUTH01105</ns2:ErrorCode>
                <ns2:Description>Ошибка формата подписи запроса</ns2:Description>
                <ns2:StackTrace>ru.lanit.hcs.integration.common.exception.OperationProcessorException: ЭП не прошла проверку: Invalid XML Signature</ns2:StackTrace>
            </ns2:ErrorMessage>
        </ns5:exportNsiItemResult>
    </soap:Body>
</soap:Envelope>


Подскажите пожалуйста:
1) Как сделать валидную подпись, которая будет проходить проверку сервером, используя WCF ?
2) Как с помощью средств CryptoPro.NET отказаться от использования «МагПро КриптоТуннель» ?
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.12.2015, 11:46
Ответы с готовыми решениями:

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

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

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

999
13 / 13 / 0
Регистрация: 25.01.2016
Сообщений: 38
25.01.2016, 13:36
Студворк — интернет-сервис помощи студентам
Тоже работаем над интеграцией с ГИС ЖКХ. Так же по тестовой организации c ОГРН 1095658018642 Нет объектов для экспорта. Написали в техподдержку. Обрабатывают уже две недели. Интеграцию делаем на C#. Создал прокси-класс через студию указав в качестве url сервиса file:///<путь>/hcs-organizations-registry-service-7.3.0.1.wsdl.
Через stunnel нормально работает. Сейчас пробую самому создавать канал по примеру:
http://cpdn.cryptopro.ru/conte... 631ed2.htm.
Сертификат установлен в Личное. Сертификат Тестовый УЦ ООО "КРИПТО-ПРО" установлен в доверенные корневые центры.
При попытке вызвать методы сервиса - ошибка:
System.ServiceModel.Security.SecurityNeg otiationException: Не удалось установить доверительные отношения для защищенного канала SSL/TLS с полномочиями "54.76.42.99:60045". ---> System.Net.WebException: Базовое соединение закрыто: Не удалось установить доверительные отношения для защищенного канала SSL/TLS. ---> System.Security.Authentication.Authentic ationException: Удаленный сертификат недействителен согласно результатам проверки подлинности.
Если добавить
C#
1
System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate (object s, System.Security.Cryptography.X509Certificates.X509Certificate certificate, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors) { return true; };
то уже другая:
FMT001300: Некорректный XML (Дополнительные сведения об ошибке — Test.GISGKHServices.Fault).
Через stunnel при этом всё нормально проходит. Для включения шифрования изменяю только

Добавлено через 21 минуту
Для шифрования изменяю только app.config

Добавлено через 1 час 59 минут
Если кому интересно, то нашел способ ходить по https без туннеля. Прокси класс сгенерировал с помощью wsdl.exe. Он создается как наследник класса SoapHttpClientProtocol. Ему просто добавляем наш сертификат через ClientCertificates.Add. И запрос нормально обрабатывается. Единственное пришлось доработать напильником класс, т.к. он не правильно кодировку обрабатывал и ответ от сервера приходил вопросиками, вместо русских букв.
Просто перекрыл один метод класса:
C#
1
2
3
4
5
6
7
protected override WebResponse GetWebResponse(WebRequest request)
        {
            var response = base.GetWebResponse(request);
            response.Headers["Content-Type"] = "text/xml; charset=utf-8"; 
            return response;
 
        }
Добавлено через 40 минут
Пока воевал с https техподдержка прислала ответ, что: Ошибка исправлена. Метод exportOrgRegistry возвращает корректные данные.
Видать при обработке заявки что-то они куда-то недовносят, т.к. тестовый сайт данные по поставщику информации отображает и в поиске находит, а api не дает организацию.
Теперь свою тестовую контору видим методом exportOrgRegistryRequest.
0
0 / 0 / 0
Регистрация: 21.01.2016
Сообщений: 20
25.01.2016, 20:22
Araney, не получается сгенерировать проксикласс с помощью wsdl.exe
использую wsdl и xsd с сайта ГИС

Что то нужно дополнительно сделать? или какой ключ указать..
хочу сравнить эти классы с тем, что генериурет VS через веб сервисы

Добавлено через 9 минут
разобрался, надо было доуказать схемы

Добавлено через 1 час 59 минут
Кому то удалось корректно подписать xml?
0
13 / 13 / 0
Регистрация: 25.01.2016
Сообщений: 38
26.01.2016, 14:08
Для настройки соединения https для класса, сгенерированного через студию подходит вариант с basicHttpBinding. Почему-то его сразу не использовал, а пробовал wsHttpBinding и customBinding.

И ещё надо или в программе вызвать:
C#
1
System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate (object s, X509Certificate certificate, X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors) { return true; };
Или в app.config указать:
XML
1
2
3
4
5
6
7
<system.net>
<settings>
<servicePointManager
checkCertificateName="false"
checkCertificateRevocationList="false"/>
</settings>
</system.net>
Иначе сертификат сервера не проходит валидацию. Может на боевом сервере это не пригодится.

Добавлено через 3 минуты
По поводу подписи - вот человек разбирался https://www.cryptopro.ru/forum... sts&t=9870.
Сам пока не смотрел - на неделе попробую разобраться.

Добавлено через 7 часов 9 минут
versh23, Как писал выше, классы получаемые через студию (Добавить ссылку на службу) и через утилиту wsdl отличаются. Через wsdl получается наследник System.Web.Services.Protocols.SoapHttpCl ientProtocol, через студию (и наверно утилиту svcutil) System.ServiceModel.ClientBase.
0
0 / 0 / 0
Регистрация: 21.01.2016
Сообщений: 20
28.01.2016, 14:44
я пока остановился на wcf, проще модифицировать.

Добавлено через 6 часов 27 минут
стала беспокоить скорость работы сервиса.. У меня получается в среднем 1.4с на внесение 1 дома. А таких домов будет больше 100 тысяч. Выполняю в синхронном режиме. Как вариант сделать в асинхронном либо на тестовом стенде низкая производительность.. Как вы будете решать данную проблему?

Поделитесь вообще вашими успехами - интересно
0
13 / 13 / 0
Регистрация: 25.01.2016
Сообщений: 38
02.02.2016, 10:41
У кого-нибудь получилось через wcf подписывать сообщения?
0
0 / 0 / 0
Регистрация: 21.01.2016
Сообщений: 20
02.02.2016, 11:21
Araney, а не через wcf ?
0
13 / 13 / 0
Регистрация: 25.01.2016
Сообщений: 38
02.02.2016, 15:46
versh23, Как подписывать нашел по ссылке что выкладывал выше. Самому почти ничего и не надо делать. Вот его обновленный проект: https://github.com/springjazzy/Xades
Там уже даже создан класс - обертка, на вход которого подаешь xml без подписи и получаешь с подписью (GisSignatureHelper.GetSignedRequestXade s). На ГИС ЖКХ проходит.
0
0 / 0 / 0
Регистрация: 21.01.2016
Сообщений: 20
02.02.2016, 18:07
Araney, подписать(подменить) xml можно через инспекторов https://msdn.microsoft.com/en-... .110).aspx

а меня ругается, что закрытый ключ не поддерживается. Скачал отсюда https://www.cryptopro.ru/products/net/downloads
КриптоПро .NET и NETSDK-x64-rus.msi, поставил со всеми галками. Проект собирается на 4.0 и все равно не работает.. не было такого?
0
13 / 13 / 0
Регистрация: 25.01.2016
Сообщений: 38
03.02.2016, 06:44
versh23, В самой форме ругается, когда ставишь галку включать закрытый ключ. На преобразование типов. Но я сделал свою. Сейчас выложу.
0
13 / 13 / 0
Регистрация: 25.01.2016
Сообщений: 38
03.02.2016, 10:19
Вот проект - простая форма, подписывающая сообщение, которое например через SoapUI можно потестить. Спасибо разработчику https://github.com/springjazzy
Вложения
Тип файла: zip GISGKH.zip (2.88 Мб, 230 просмотров)
1
0 / 0 / 0
Регистрация: 21.01.2016
Сообщений: 20
03.02.2016, 10:54
Araney, А вы можете попробовать подписать запрос на получение информации о доме(exportHouseRequest), например? у меня на нем получается "внутренняя ошибка", а в запросе (который в вашем приложении) все без ошибок.

еще заметил, что вы тоже это место подправили
https://github.com/springjazzy... es.cs#L254
0
0 / 0 / 0
Регистрация: 24.12.2015
Сообщений: 3
03.02.2016, 12:05
Пробую пользоваться методом ExportHouseData, выводится ошибка что "Сертификат выдан не аккредитованным УЦ", хотя подпись была получена у аккредитованного УЦ и проверяется сервисом на госуслугах.
Кто-нибудь сталкивался?
0
6 / 6 / 0
Регистрация: 24.12.2015
Сообщений: 41
03.02.2016, 12:53
дайте xml запроса и ответа

Добавлено через 7 минут
Araney, я не особо в программировании, тем более на C#. у меня ошибка после нажатия кнопки "Продписать"
"Неправильный дескриптор m_safeCertContext."
0
0 / 0 / 0
Регистрация: 21.01.2016
Сообщений: 20
03.02.2016, 14:37
Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
    <h:RequestHeader xmlns="http://dom.gosuslugi.ru/schema/integration/8.5.0.2/" 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/8.5.0.2/">
      <Date>2016-02-03T14:12:39.8216773+03:00</Date>
      <MessageGUID>21287fbf-6b38-48b7-bc18-b4077c94f59c</MessageGUID>
      <SenderID>8b1647f2-38a8-41af-98b6-a5ac40dcb0d7</SenderID>
    </h:RequestHeader>
  </s:Header>
  <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <exportHouseRequest xmlns="http://dom.gosuslugi.ru/schema/integration/8.5.0.2/house-management/">
      <FIASHouseGuid>5f46d9c4-ef16-4493-8e4e-1bf2a8f4b3e0</FIASHouseGuid>
    </exportHouseRequest>
  </s:Body>
</s:Envelope>


все хорошо, но стоит подписать
Кликните здесь для просмотра всего текста

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
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Header>
        <h:RequestHeader xmlns="http://dom.gosuslugi.ru/schema/integration/8.5.0.2/" xmlns:h="http://dom.gosuslugi.ru/schema/integration/8.5.0.2/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <Date>2016-02-03T14:13:49.8990852+03:00</Date>
            <MessageGUID>4c011277-5028-409a-ba93-feaf73a8ab60</MessageGUID>
            <SenderID>8b1647f2-38a8-41af-98b6-a5ac40dcb0d7</SenderID>
        </h:RequestHeader>
    </s:Header>
    <s:Body xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <exportHouseRequest Id="signed-data-container" xmlns="http://dom.gosuslugi.ru/schema/integration/8.5.0.2/house-management/">
            <ds:Signature Id="xmldsig-95e45bf6-4388-4c2b-b8a1-34dbf2f6552b" xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
                <ds:SignedInfo>
                    <ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
                    <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411"/>
                    <ds:Reference Id="xmldsig-95e45bf6-4388-4c2b-b8a1-34dbf2f6552b-ref0" URI="#signed-data-container">
                        <ds:Transforms>
                            <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
                            <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
                        </ds:Transforms>
                        <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411"/>
                        <ds:DigestValue>SRJ3BxbKGAESfSuNf/ko+jIoVbyD5yTmUl0+PlbVE0g=</ds:DigestValue>
                    </ds:Reference>
                    <ds:Reference Type="http://uri.etsi.org/01903#SignedProperties" URI="#xmldsig-95e45bf6-4388-4c2b-b8a1-34dbf2f6552b-signedprops">
                        <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411"/>
                        <ds:DigestValue>5dNz3lCJPsCaHhV/Ohj0DcqcIgXFvD8dLrZ6R7yTiNw=</ds:DigestValue>
                    </ds:Reference>
                </ds:SignedInfo>
                <ds:SignatureValue Id="xmldsig-95e45bf6-4388-4c2b-b8a1-34dbf2f6552b-sigvalue">jZDLNtirCBRMCJaa++dAI3CJhRdHm1AfYAkLZjB6kAsiLriylVasNtWlDVoDgAHhRxQ73b7HX8qqBslb7cdfUA==</ds:SignatureValue>
                <ds:KeyInfo>
                    <ds:X509Data>
                        <ds:X509Certificate>MIIDrjCCA12gAwIBAgITEgAL3Y7MCHDfcm4CmwAAAAvdjjAIBgYqhQMCAgMwfzEjMCEGCSqGSIb3DQEJARYUc3VwcG9ydEBjcnlwdG9wcm8ucnUxCzAJBgNVBAYTAlJVMQ8wDQYDVQQHEwZNb3Njb3cxFzAVBgNVBAoTDkNSWVBUTy1QUk8gTExDMSEwHwYDVQQDExhDUllQVE8tUFJPIFRlc3QgQ2VudGVyIDIwHhcNMTUxMjI0MDcxMjM5WhcNMTYwMzI0MDcyMjM5WjCBvDEjMCEGCSqGSIb3DQEJARYUemFpa2luX2FvQGJlbHNieXQucnUxJDAiBgNVBAMMG9CX0LDQuNC60LjQvSDQkNC70LXQutGB0LXQuTEPMA0GA1UECwwG0JTQmNCiMTYwNAYDVQQKDC3QntCQ0J4gItCR0LXQu9Cz0L7RgNC+0LTRjdC90LXRgNCz0L7RgdCx0YvRgiIxGTAXBgNVBAcMENCR0LXQu9Cz0L7RgNC+0LQxCzAJBgNVBAYTAlJVMGMwHAYGKoUDAgITMBIGByqFAwICJAAGByqFAwICHgEDQwAEQMX+h4kVMr2+cXpD0NkSUrui+4lWlLxe6hALoFu+IWsSTi4U8dMhLzcGcNGEPrGYFnrwhPzIGZ94Zy97v/6dD6ujggFwMIIBbDAOBgNVHQ8BAf8EBAMCBPAwEwYDVR0lBAwwCgYIKwYBBQUHAwIwHQYDVR0OBBYEFOV4rn4VKKi2ga2ByCiqmFZqTzzXMB8GA1UdIwQYMBaAFBUxfLCNGt5m1xWcSVKXFyS5AXqDMFkGA1UdHwRSMFAwTqBMoEqGSGh0dHA6Ly90ZXN0Y2EuY3J5cHRvcHJvLnJ1L0NlcnRFbnJvbGwvQ1JZUFRPLVBSTyUyMFRlc3QlMjBDZW50ZXIlMjAyLmNybDCBqQYIKwYBBQUHAQEEgZwwgZkwYQYIKwYBBQUHMAKGVWh0dHA6Ly90ZXN0Y2EuY3J5cHRvcHJvLnJ1L0NlcnRFbnJvbGwvdGVzdC1jYS0yMDE0X0NSWVBUTy1QUk8lMjBUZXN0JTIwQ2VudGVyJTIwMi5jcnQwNAYIKwYBBQUHMAGGKGh0dHA6Ly90ZXN0Y2EuY3J5cHRvcHJvLnJ1L29jc3Avb2NzcC5zcmYwCAYGKoUDAgIDA0EA35KIeXzwphsosuk8yg6oDQ0g+SvOCbrq1u6oVIB35IVQpiIYPJD0t9kVW1p22bHZ1B+1rcdy3lLqAjzpSK0ENg==</ds:X509Certificate>
                    </ds:X509Data>
                </ds:KeyInfo>
                <ds:Object>
                    <xades:QualifyingProperties Target="#xmldsig-95e45bf6-4388-4c2b-b8a1-34dbf2f6552b" xmlns:xades="http://uri.etsi.org/01903/v1.3.2#" xmlns:xades141="http://uri.etsi.org/01903/v1.4.1#">
                        <xades:SignedProperties Id="xmldsig-95e45bf6-4388-4c2b-b8a1-34dbf2f6552b-signedprops">
                            <xades:SignedSignatureProperties>
                                <xades:SigningTime>2016-02-03T14:13:50.729+03:00</xades:SigningTime>
                                <xades:SigningCertificate>
                                    <xades:Cert>
                                        <xades:CertDigest>
                                            <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411"/>
                                            <ds:DigestValue>V40HpYMEicRaVob0qvjhBR0ahhLUqkUIR1VwkrRu7Ws=</ds:DigestValue>
                                        </xades:CertDigest>
                                        <xades:IssuerSerial>
                                            <ds:X509IssuerName>E=support@cryptopro.ru,C=RU,L=Moscow,O=CRYPTO-PRO LLC,CN=CRYPTO-PRO Test Center 2</ds:X509IssuerName>
                                            <ds:X509SerialNumber>401417451180418849565991452775578105084108174</ds:X509SerialNumber>
                                        </xades:IssuerSerial>
                                    </xades:Cert>
                                </xades:SigningCertificate>
                            </xades:SignedSignatureProperties>
                        </xades:SignedProperties>
                    </xades:QualifyingProperties>
                </ds:Object>
            </ds:Signature>
            <FIASHouseGuid>5f46d9c4-ef16-4493-8e4e-1bf2a8f4b3e0</FIASHouseGuid>
        </exportHouseRequest>
    </s:Body>
</s:Envelope>


внутренняя ошибка
0
13 / 13 / 0
Регистрация: 25.01.2016
Сообщений: 38
03.02.2016, 15:05
Dr_Elvis, Там нужно, чтобы подписываемый элемент имел Id="signed-data-container". По нему жестко ищется подписываемый блок
0
6 / 6 / 0
Регистрация: 24.12.2015
Сообщений: 41
03.02.2016, 16:36
versh23, замените в элементе X509IssuerName "E" на OID 1.2.840.113549.1.9.1
так же у вас нет инн, огрн поставщика от которого вы отправляете.
OID ИНН = 1.2.643.3.131.1.1
OID ОГРН = 1.2.643.100.1

и сертификат у вас без инн и огрн, переделайте https://www.cryptopro.ru/ui/Re... ubject.asp

Добавлено через 3 минуты
Araney, у меня даже не подписывается xml которая в поле по умолчанию стоит. пробовал другой - тоже самое, хотя Id="signed-data-container"
0
0 / 0 / 0
Регистрация: 21.01.2016
Сообщений: 20
03.02.2016, 16:50
Dr_Elvis, спасибо. переделаю сертификат.
Но почему тогда подписанный запрос на exportDataProviderRequest проходит?
0
6 / 6 / 0
Регистрация: 24.12.2015
Сообщений: 41
03.02.2016, 16:53
versh23, потому что organizations-registry не проверяет подпись. Логично: подпись должна быть поставщика данных, то есть подпись должна совпадать с SenderID, а в organizations-registry не используется SenderID, потому что еще не привязан поставщик. этот сервис для ИС, а не для поставщика.
1
1 / 1 / 0
Регистрация: 03.02.2016
Сообщений: 13
04.02.2016, 05:42
Здравствуйте. Тоже интегрирую в ГИС свой арм.
Подскажите пожалуйста, что-то никак не могу понять: что конкретно нужно давать на вход для подписи? какой xml?
Какую-то одну ноду? или что?

Например, у меня есть запрос:

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:org="http://dom.gosuslugi.ru/schema/integration/8.5.0.2/organizations-registry/" xmlns:ns="http://dom.gosuslugi.ru/schema/integration/8.5.0.2/" xmlns:xd="http://www.w3.org/2000/09/xmldsig#">
   <soapenv:Header>
      <org:ISRequestHeader>
<ns:Date>2016-02-01T00:00:00.0000000+07:00</ns:Date>
<ns:MessageGUID>e2567f90-d8ea-4c33-880b-dcb96c687040</ns:MessageGUID>
      </org:ISRequestHeader>
   </soapenv:Header>
   <soapenv:Body>
      <org:exportOrgRegistryRequest>
        <org:SearchCriteria>
           <ns:OGRN>12345678901234</ns:OGRN>
         </org:SearchCriteria>
      </org:exportOrgRegistryRequest>
   </soapenv:Body>
</soapenv:Envelope>
мне весь этот xml подписывать и потом внутрь элемента "org:exportOrgRegistryRequest" пихать все эти Signature, SignedInfo и т.д.?
или на вход давать только один какой-то элемент? И вообще, подписывается ведь только Digest (хэш), а этот хэш на основе какого xml вычисляется?

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

И следом еще вопрос: у меня есть метод, который подписывает текст нужным ГОСТ алгоритмом через библиотеку BouncyCastle. Можно ли ему скармливать весь этот xml? Или XAdES-BES метод как-то подругому подписывает?

Спасибо.
0
13 / 13 / 0
Регистрация: 25.01.2016
Сообщений: 38
04.02.2016, 07:11
mortifactor, подписывается элемент org:exportOrgRegistryRequest, но ему надо указать атрибут Id. Все созданные ноды внутрь этого элемента пихаются. Пример подписи санного элемента выше.

Добавлено через 59 секунд
Dr_Elvis, Ошибка вроде из библиотеки криптопрошной.

Добавлено через 7 минут
Пока не знаю как лучше реализовать - получается, что нужно сообщения от разных поставщиков данных подписывать своим сертификатом. У нас система одна на многих поставщиков. Либо держать у себя все ЭЦП, что думаю юридически не верно, либо нужно участие поставщика в отправке информации - уходим от автономной работы системы.
Разработчик https://github.com/springjazzy смотрю делает клиент - серверную систему. Сервер формирует сообщение, клиент его подписывает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.02.2016, 07:11

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

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

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

1С и ГИС ЖКХ. Интеграция
Доброго дня, коллеги! Я думаю многие слышали о такой ГИС, как ЖКХ. Друзья, сталкивался ли кто нибудь с задачей интеграции с этой...

Интеграция с ГИС ЖКХ (ГЖ). 400 Bad request
Вводная: 1. C#. Классы proxy для работы с API генерятся утилитой SvcUtil.exe из wsdl-ек. 2. При срабатывании форматно-логического...


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

Или воспользуйтесь поиском по форуму:
60
Закрытая тема Создать тему
Новые блоги и статьи
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru