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

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

16.12.2015, 11:46. Показов 174906. Ответов 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
1 / 1 / 2
Регистрация: 26.05.2013
Сообщений: 24
10.05.2016, 11:14
Студворк — интернет-сервис помощи студентам
Доброго времени суток.

У кого нибудь получилось добавлять дома, подъезды, квартиры при помощи инструментов предоставляемыми гис жкх?
Если таковые имеются - поделитесь, пожалуйста, вашими наработками.
0
 Аватар для hhmm
67 / 58 / 1
Регистрация: 01.04.2016
Сообщений: 346
11.05.2016, 13:05
Со вчерашнего дня с тестового сервера на все запросы стал получать ошибку FMT001300 - Некорректный XML. Это я что-то не так делаю или у всех так?
0
1 / 1 / 1
Регистрация: 23.03.2016
Сообщений: 20
11.05.2016, 15:35
[soap:Server] AUT011008: Поставщик данных SenderID=9875cc2e-73f9-41d6-bceb-47b48ed23395 не найден или не актуальный


Кто сталкивался при добавлении ДУ и домов?
0
0 / 0 / 0
Регистрация: 13.11.2012
Сообщений: 61
11.05.2016, 15:46
Цитата Сообщение от hhmm Посмотреть сообщение
Со вчерашнего дня с тестового сервера на все запросы стал получать ошибку FMT001300 - Некорректный XML. Это я что-то не так делаю или у всех так?
мб опять что то в тихомолочку обновили
0
13 / 11 / 0
Регистрация: 05.02.2016
Сообщений: 79
12.05.2016, 13:53
Цитата Сообщение от hhmm Посмотреть сообщение
Со вчерашнего дня с тестового сервера на все запросы стал получать ошибку FMT001300 - Некорректный XML. Это я что-то не так делаю или у всех так?
Не получилось устранить проблему?
0
 Аватар для hhmm
67 / 58 / 1
Регистрация: 01.04.2016
Сообщений: 346
12.05.2016, 14:10
Цитата Сообщение от miron_valentin Посмотреть сообщение
Не получилось устранить проблему?
Нет, все по прежнему плохо.

Непонятно, в чем проблема. Точнее говоря, предполагаю, что проблема в руках писателей из Ланита, но нет мыслей как ее обойти - в ответе сервера нет никакой информации, что именно ему не нравится.
0
6 / 6 / 0
Регистрация: 24.12.2015
Сообщений: 41
12.05.2016, 14:13
hhmm, напишите пример запроса
0
 Аватар для hhmm
67 / 58 / 1
Регистрация: 01.04.2016
Сообщений: 346
12.05.2016, 14:36
Цитата Сообщение от Dr_Elvis Посмотреть сообщение
hhmm, напишите пример запроса
Пожалуйста, в приложении.
Вложения
Тип файла: zip запрос - exportNsiItem.zip (1.8 Кб, 53 просмотров)
0
6 / 6 / 0
Регистрация: 24.12.2015
Сообщений: 41
12.05.2016, 14:45
hhmm, лишнее:
XML
1
<ActivityId CorrelationId="35a0b357-b9b8-4994-ae5e-d941f9cff598" xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics">6c85fc48-16fd-4d63-98a5-2838157b03c3</ActivityId>
1
 Аватар для hhmm
67 / 58 / 1
Регистрация: 01.04.2016
Сообщений: 346
12.05.2016, 15:41
Цитата Сообщение от Dr_Elvis Посмотреть сообщение
hhmm, лишнее:
Есть некий инструмент от Microsoft, SvcTraceViewer.exe, называется Microsoft Service Trace Viewer, идет в комплекте SDK.
У меня находится в каталоге "C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin".
Эта утилита позволяет смотреть (при помощи ведения лога специального формата) как SOAP сообщения перемещаются от клиента к серверу и обратно.

Лог включается в файле конфигурации приложения следующим образом (пример нашел в интернете):

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  <system.diagnostics>
    <trace autoflush="true" />
    <sources>
      <source name="System.ServiceModel"
              switchValue="Information, ActivityTracing"
              propagateActivity="true">
        <listeners>
          <add name="sdt"
              type="System.Diagnostics.XmlWriterTraceListener"
              initializeData= "SdrConfigExample.e2e" />
        </listeners>
      </source>
    </sources>
  </system.diagnostics>
После работы программы образуется файл лога SdrConfigExample.e2e который можно посмотреть при помощи вышеупомянутой утилиты.

Для того, чтобы записать этот трейс, Visual Studio внедряет в биндинги запроса еще одну привязку (это видно в отладчике) и, судя по всему, дописывает в заголовок сообщения свой идентификатор отправляемого сообщения в ActivityId.
1
6 / 6 / 0
Регистрация: 24.12.2015
Сообщений: 41
12.05.2016, 17:19
hhmm, убирайте этот тег перед отправкой и должно быть счастье. я отправил Ваш запрос без этого тега - всё ок
0
476 / 239 / 114
Регистрация: 12.05.2016
Сообщений: 647
12.05.2016, 21:06
Коллеги, прочитал все 19 страниц темы.
Есть один глупый вопрос: где брать НЕ тестовый транспортный сертификат для защиты канала ?

ЭЦП получили для организации, лицензии на КриптоПро CSP и КриптоПро .NET закупили.
Всё настроили через "MagPro Криптотуннель" , работает.
Но транспортный сертификат до сих пор используем тестовый, ибо в методичке описан процесс только для получения тестового сертификата.

Что нужно сделать по шагам?
Допустим, "позвонить в КриптоПро и спросить у них: " ЧТО спросить? Сколько стоит транспортный сертификат для ГисЖКХ ??
У меня не хватает квалификации в этих самых криптозащитах, чтобы сформулировать, что мне надо конкретно
0
 Аватар для hhmm
67 / 58 / 1
Регистрация: 01.04.2016
Сообщений: 346
12.05.2016, 21:58
Цитата Сообщение от Dr_Elvis Посмотреть сообщение
hhmm, убирайте этот тег перед отправкой и должно быть счастье. я отправил Ваш запрос без этого тега - всё ок
Да, спасибо, я уже после вашей наводки догадался в чем дело. Просто отвлекли и я не смог изложить свою мысль до конца в предыдущем сообщении.
А мысль следующая: я посмотрел, когда появляется этот тег ActivityId - так вот, он появляется в XML документе до того, как я его подписываю.
Таким образом, в Ланит отправляется документ с этой вставкой отладчика в заголовке подписанный как единое целое.
И xml документ - правильный. А вот ответ сервера - Некорректный XML отражает лишь мнение одного из разработчиков Ланита, который почему-то решил, что если в заголовке есть теги которых он не знает и не понимает, то заголовок - неправильный.

Ведь проблема у Ланита с разбором заголовка:

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
    <soap:Fault xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
            <faultcode>soap:Server</faultcode>
            <faultstring>FMT001300: Некорректный XML</faultstring>
            <detail>
                <ns4:Fault xmlns:ns4="http://dom.gosuslugi.ru/schema/integration/8.7.0.7/">
                    <ns4:ErrorCode>FMT001300</ns4:ErrorCode>
                    <ns4:ErrorMessage>Некорректный XML</ns4:ErrorMessage>
                    <ns4:StackTrace>nit.hcs.integration.common.spring.processor.ValidationProcessor.processHeaders(ValidationProcessor.java:127)
    ... 47 more
</ns4:StackTrace>
                </ns4:Fault>
            </detail>
        </soap:Fault>
А SvcTraceViewer инструмент полезный, по крайней мере он мне некоторым образом помог решить проблему шифрования туннеля без сторонних программ типа МакПро, ИнтерПро и прочих sТуннелей.

Но теперь, к сожалению, этим инструментом воспользоваться не удастся
Миниатюры
Интеграция с ГИС ЖКХ. Подпись SOAP и защита канала по ГОСТ  
Вложения
Тип файла: zip exportNsiItem - запросы и ответы.zip (3.1 Кб, 21 просмотров)
0
 Аватар для hhmm
67 / 58 / 1
Регистрация: 01.04.2016
Сообщений: 346
12.05.2016, 22:08
Цитата Сообщение от Anvano Посмотреть сообщение
Что нужно сделать по шагам?
Допустим, "позвонить в КриптоПро и спросить у них: " ЧТО спросить? Сколько стоит транспортный сертификат для ГисЖКХ ??
Вам не нужно никуда звонить - у вас уже все есть. Вы уже получили ЭЦП для организации, в ней есть все что вам нужно, вам нужно только из нее все извлечь.
Первым шагом вам нужно извлечь закрытый ключ и поместить его в контейнер (это такой специальный файл) с расширением pfx.
Инструкция как это сделать, если я не ошибаюсь, у КриптоПро есть, если нет то где нибудь найдете в интернете.

Второй шаг описан в документе Методические рекомендации по работе с СИТ в разделе 3. Создание соединения с алгоритмом шифрования ГОСТ Р 34.10-2001.. Действуйте начиная с пункта 3 этого раздела, только вместо тестового ключа используйте ваш, настоящий.
1
476 / 239 / 114
Регистрация: 12.05.2016
Сообщений: 647
12.05.2016, 22:52
Вам не нужно никуда звонить - у вас уже все есть. Вы уже получили ЭЦП для организации, в ней есть все что вам нужно, вам нужно только из нее все извлечь.
Ааа, понятно! Спасибо огромное.
Расковыривание сертификата, для прикрепления к заявке на регистрацию в ГисЖКХ я уже проходил, надеюсь справимся и второй раз.

Просто неочевидно было, что ЭЦП это и есть сертификат, и какого-то отдельного "транспортного сертификата" не требуется.
0
187 / 100 / 19
Регистрация: 15.09.2011
Сообщений: 801
13.05.2016, 07:41
Много времени не мог зайти на форум, так рвался помочь Вам с незаменимым инструментом, который поможет Вам в отладке. Этот инструмент может даже дешифровать HTTPS = поэтому я его ставлю как прокси, через который моя студия посылает https запросы в обход криптотуннеля.
Этот инструмент - https://www.telerik.com/download/fiddler
Вёб отладчик - он лучший в своём роде, особенно при взломе сайтов и отладке любых запросов - ответов.
Его логи я отправляю на ГИС ЖКХ и мне не задают глупых уточняющих вопросов.
Качайте, разбирайтесь - убедитесь сами, что он лучший.

Добавлено через 36 минут
Цитата Сообщение от hhmm Посмотреть сообщение
Но теперь, к сожалению, этим инструментом воспользоваться не удастся
Почему?
Цитата Сообщение от Anvano Посмотреть сообщение
ЭЦП получили для организации, лицензии на КриптоПро CSP и КриптоПро .NET закупили.
Всё настроили через "MagPro Криптотуннель" , работает.
Но транспортный сертификат до сих пор используем тестовый, ибо в методичке описан процесс только для получения тестового сертификата.
Я бы вам советовал получать уже настоящий - боевой сертификат. Им можно устанавливать транспорт и с помощью него я захожу на реальную ГИС-ЖКХ. Системе всё равно, главное, чтобы сертификат удовлетворял условиям при регистрации на ГИС ЖКХ и описанными в Методических указаниях к СИТ.
0
0 / 0 / 0
Регистрация: 20.01.2016
Сообщений: 36
13.05.2016, 08:13
у кого-нибудь есть пример xml метода importAccountData, как заполняются поля "Closed" (Счет закрыт), "PremisesGUID" (Идентификатор помещения) и "PayerInfo" (Сведения о плательщике). Идентификатор помещения - это наш идентификатор? Справочники нужно загружать или нет?
0
 Аватар для hhmm
67 / 58 / 1
Регистрация: 01.04.2016
Сообщений: 346
13.05.2016, 10:15
Цитата Сообщение от umatkot Посмотреть сообщение
Почему?
Потому что при включении диагностики для приложения в файле конфигурации, как я показал в посте 370, эта система диагностики начинает вставлять в заголовок тег ActivityId .
Этот служебный заголовок в начале этой недели наши 'партнеры' из Ланита (очень хорошее и емкое слово которое употребляет наш министр иностранных дел Сергей Викторович Лавров) стали считать ошибкой и выдавать FMT001300 - Некорректный XML.


На самом деле этот лог был бы удобен в следующих ситуациях: предположим, в вашего удаленного клиента что-то пошло не так.
Отправляете ему эту вставку в файл конфигурации приложения, просите понажимать кнопки, в лог пишется все общение клиента с сервером.
Просите прислать лог, сидите и рассматриваете его.
0
6 / 6 / 0
Регистрация: 24.12.2015
Сообщений: 41
13.05.2016, 10:24
Цитата Сообщение от hhmm Посмотреть сообщение
А вот ответ сервера - Некорректный XML отражает лишь мнение одного из разработчиков Ланита, который почему-то решил, что если в заголовке есть теги которых он не знает и не понимает, то заголовок - неправильный.
а с чего вы взяли что заголовок у вас правильный? в wsdl четко описано что должно быть в заголовке:
XML
1
2
3
4
<wsdl:input>
    <soap:body use="literal"/>
    <soap:header message="tns:ISRequestHeader" part="Header" use="literal"/>
</wsdl:input>
а вот сам ISRequestHeader:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<xs:element name="ISRequestHeader" type="tns:HeaderType">
    <xs:annotation>
        <xs:documentation>Заголовок запроса</xs:documentation>
    </xs:annotation>
</xs:element>
<xs:complexType name="HeaderType">
    <xs:annotation>
        <xs:documentation>Базовый тип заголовка</xs:documentation>
    </xs:annotation>
    <xs:sequence>
        <xs:element name="Date" type="xs:dateTime">
            <xs:annotation>
                <xs:documentation>Дата отправки пакета</xs:documentation>
            </xs:annotation>
        </xs:element>
        <xs:element name="MessageGUID" type="tns:GUIDType">
            <xs:annotation>
                <xs:documentation>Идентификатор сообщения</xs:documentation>
            </xs:annotation>
        </xs:element>
    </xs:sequence>
</xs:complexType>
0
476 / 239 / 114
Регистрация: 12.05.2016
Сообщений: 647
13.05.2016, 10:59
Цитата Сообщение от VladimirGT Посмотреть сообщение
у кого-нибудь есть пример xml метода importAccountData, как заполняются поля "Closed" (Счет закрыт), "PremisesGUID" (Идентификатор помещения) и "PayerInfo" (Сведения о плательщике). Идентификатор помещения - это наш идентификатор? Справочники нужно загружать или нет?
PremisesGUID - это идентификатор помещения выгруженный методом exportHouseData, но ЛС может быть создан не только на помещение, но и на FIASHouseGuid (если это частный дом) и на LivingRoomGUID (если это коммуналка)


Как-то так:
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
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://dom.gosuslugi.ru/schema/integration/8.7.0.7/" xmlns:hous="http://dom.gosuslugi.ru/schema/integration/8.7.0.7/house-management/" xmlns:xd="http://www.w3.org/2000/09/xmldsig#">
   <soapenv:Header>
      <ns:RequestHeader>
         <ns:Date>2016-05-11T16:30:00</ns:Date>
         <ns:MessageGUID>${=java.util.UUID.randomUUID()}</ns:MessageGUID>
         <ns:SenderID>???</ns:SenderID>
      </ns:RequestHeader>
   </soapenv:Header>
   <soapenv:Body>
      <hous:importAccountRequest>
        <hous:Account>
            <!-- В зависимости от типа организации счет создается для УО или РСО -->
            <!--<hous:isUOAccount>true</hous:isUOAccount>-->
            <hous:isRSOAccount>true</hous:isRSOAccount>
            <hous:CreationDate>2016-05-01T00:00:00</hous:CreationDate>
            <hous:TotalSquare>100</hous:TotalSquare>
            <hous:Accommodation>
               <!-- В зависимости от атрибутов дома и лицевого счета, счет создается в доме, помещении или комнате -->
               <hous:PremisesGUID>2997d395-d39b-4e5a-996d-d6b1545f28de</hous:PremisesGUID>
               <!--<hous:FIASHouseGuid>?</hous:FIASHouseGuid>-->
               <!--<hous:LivingRoomGUID>?</hous:LivingRoomGUID>-->
            </hous:Accommodation>
            <hous:PayerInfo>
               <hous:Ind>
                  <ns:Surname>Тест</ns:Surname>
                  <ns:FirstName>Тест</ns:FirstName>
                  <ns:Patronymic>Тест</ns:Patronymic>
                  <hous:Sex>M</hous:Sex>
                  <hous:DateOfBirth>1980-01-01</hous:DateOfBirth>
                  <!--<ns:SNILS>?</ns:SNILS>-->
                  <ns:ID>
                     <ns:Type>
                        <ns:Code>1</ns:Code>
                        <ns:GUID>d0932210-8261-46b9-8e62-e45a6dc700a9</ns:GUID>
                     </ns:Type>
                     <ns:Series>0000</ns:Series>
                     <ns:Number>000000</ns:Number>
                     <ns:IssueDate>2000-01-01</ns:IssueDate>
                  </ns:ID>
               </hous:Ind>
            </hous:PayerInfo>
            <ns:TransportGUID>${=java.util.UUID.randomUUID()}</ns:TransportGUID>
            <ns:AccountNumber>87928374982739472343</ns:AccountNumber>
         </hous:Account>
      </hous:importAccountRequest>
   </soapenv:Body>
</soapenv:Envelope>
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.05.2016, 10:59

.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. При срабатывании форматно-логического...


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

Или воспользуйтесь поиском по форуму:
380
Закрытая тема Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка 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С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru