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

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

16.12.2015, 11:46. Показов 174750. Ответов 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
04.02.2016, 09:43
Студворк — интернет-сервис помощи студентам
Обновил тестовое приложение. Теперь в нем есть wcf-прокси класс, созданный утилитой svcutil для двух сервисов ext-bus-nsi-service/services/Nsi и ext-bus-org-registry-service/services/OrgRegistry.
В App.config нужно изменить clientCertificate findValue="28E9DC2F971EBC22C8C469AE4C6A4 932496E8091" на свой отпечаток сертификата ИС (информационной системы).
На форму кинул две кнопки - "Получить поставщика данных" - вызывает метод exportDataProvider. Выводит на экран сообщение с первым найденным актуальным (isActual = true) поставщиком данный (его GUID).
Кнопка "Получить список справочников" вызывает метод exportNsiListRequest.
Все сообщения подписываются в модуле MyBehavior.cs - там нужно поменять отпечаток сертификата на свой и пароль в методе BeforeSendRequest. Сертификаты у меня отличаются. Сертификат для подписи сообщений должен быть на организацию ОГРН и ИНН которой, совпадает с поставщиком данных (SenderId).
Для второго сервиса используется SenderId из вызова первого метода. Можно в коде прописать свой.
Первый метод можно вызывать без подписи сообщения. Второй требует подписи.
Вложения
Тип файла: zip GISGKH.zip (3.04 Мб, 223 просмотров)
0
13 / 13 / 0
Регистрация: 25.01.2016
Сообщений: 38
04.02.2016, 10:23
Да, класс генерирую просто:
>"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\svcutil" hcs-organizations-registry-service-8.5.0.2.wsdl hcs-nsi-service-8.5.0.2.wsdl *.xsd /async /n:*,dom.gosuslugi.schema.integration /edb /out:GKHService

Добавлено через 28 минут
versh23,
Я подписываю
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://dom.gosuslugi.ru/schema/integration/8.5.0.2/" xmlns:hous="http://dom.gosuslugi.ru/schema/integration/8.5.0.2/house-management/" xmlns:xd="http://www.w3.org/2000/09/xmldsig#">
   <soapenv:Header>
      <ns:RequestHeader>
         <ns:Date>2016-02-04T10:43:00</ns:Date>
         <ns:MessageGUID>62931990-ab7d-44d9-9d7f-2553ac10ab5f</ns:MessageGUID>
         <ns:SenderID>9252b0b4-09db-4e5a-85cf-c9a08421d89c</ns:SenderID>
      </ns:RequestHeader>
   </soapenv:Header>
   <soapenv:Body>
      <hous:exportHouseRequest Id="signed-data-container">
         <hous:FIASHouseGuid>5f46d9c4-ef16-4493-8e4e-1bf2a8f4b3e0</hous:FIASHouseGuid>
      </hous:exportHouseRequest>
   </soapenv:Body>
</soapenv:Envelope>
Шаблон взял из SoapUI, который он сгенерил. подставил ваш FIASHouseGuid. Подписал - в SoapUI отправляю - проходит, но у меня возвращает Доступ запрещен для поставщика данных организация "dc5ec1b0-0153-4e8d-8cce-8b4a4fa7f517", полномочие "УО".
1
4 / 3 / 0
Регистрация: 10.02.2016
Сообщений: 19
10.02.2016, 11:19
Доброго времени суток! Занимаюсь настройкой инф. взаимодействия нашей 1С и веб-сервисов ГИС ЖКХ с помощью объекта ФабрикаXDTO. Не удается найти какой-то простой и доступный способ указания свойства Signature (что, как я понимаю, является цифровой подписью) в параметрах сообщения.
Тестирую на веб-сервисе НСИ.

Не буду описывать создание объектов WSОпределение и т.п., с этим проблем нет. Перейду непосредственно к обращению к веб-сервису.

сначала создаю объект WSПрокси, с помощью которого будет вызываться операция:

1C
1
2
3
    ВСПрокси = Новый WSПрокси(ВСОпределение,ВССервис.URIПространстваИмен,ВССервис.Имя,ВСТочкаПодключения.Имя,,,ОбъектЗащищенноеСоединение);
    ВСПрокси.Пользователь = ВебСервис.Логин;
    ВСПрокси.Пароль = ВебСервис.Пароль;
затем создаю параметр операции

1C
1
2
3
    ТипПакета         = ВСПрокси.ФабрикаXDTO.Тип(стрПараметр.URIПространстваИменXDTO, стрПараметр.ТипXDTO);
    XDTOОбъект        = ВСПрокси.ФабрикаXDTO.Создать(ТипПакета);
    мПараметры.Добавить(XDTOОбъект);
и выполняю обращение к веб-сервису

1C
1
2
3
4
5
    Попытка
        Выполнить("ВозвращаемоеЗначение = ВСПрокси." + ВСОперация.Имя + "(мПараметры[0])");
    Исключение
        Сообщить("Ошибка выполнения операции " + ВСОперация.Имя + ". Текст ошибки: """ + ОписаниеОшибки() + """.");
    КонецПопытки;
Возвращается ошибка "Неверный идентификатор ИС". Тех.поддержка говорит, что проблема с сертификатом ИС. У параметра операции есть свойство Signature, его поля совпадают с полями электронной подписи из данной темы.

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

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    Сертификат = Новый СертификатКриптографии("d:/ГИС ЖКХ/БЭК.cer");
    СертификатДвоичныеДанные = Сертификат.Выгрузить();
    
    ПодписьТип = ВСПрокси.ФабрикаXDTO.Тип("http://www.w3.org/2000/09/xmldsig#","SignatureType");
    Подпись = ВСПрокси.ФабрикаXDTO.Создать(ПодписьТип);
    
    ИДТип = ВСПрокси.ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema","ID"); 
    ИД = ВСПрокси.ФабрикаXDTO.Создать(ИДТип,Строка(Новый УникальныйИдентификатор));
    Подпись.Id = ИД;
    
    КейИнфоТип = ВСПрокси.ФабрикаXDTO.Тип("http://www.w3.org/2000/09/xmldsig#","KeyInfoType");
    КейИнфо = ВСПрокси.ФабрикаXDTO.Создать(КейИнфоТип);
    
    ИДКейИнфо = ВСПрокси.ФабрикаXDTO.Создать(ИДТип,"KeyInfo");
    КейИнфо.Id = ИДКейИнфо;
    
    Х509ДатаТип = ВСПрокси.ФабрикаXDTO.Тип("http://www.w3.org/2000/09/xmldsig#","X509DataType");
    Х509Дата = ВСПрокси.ФабрикаXDTO.Создать(Х509ДатаТип);
    Х509СертТип = ВСПрокси.ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema","base64Binary");
    Х509Серт = ВСПрокси.ФабрикаXDTO.Создать(Х509СертТип,СертификатДвоичныеДанные);
    Х509Дата.X509Certificate.Добавить(Х509Серт);
    КейИнфо.X509Data.Добавить(Х509Дата);
Это далеко не полный состав полей. Пробовал создавать подпись через МенеджерКриптографии. Она создается, но в двоичном виде, который у меня не получилось преобразовать значения полей ЭП. Кто-то, кроме меня, сталкивался уже с этим? какой выход нашли?
2
6 / 6 / 0
Регистрация: 24.12.2015
Сообщений: 41
10.02.2016, 12:19
ViteG, "Неверный идентификатор ИС" - это ошибка не подписи бизнес данных, а ошибка соединения с ГИС ЖКХ. то есть у вас не создается защищенное соединение по ГОСТ. причиной может быть различный серфитикат который вы отправляли в ГИС ЖКХ и с помощью которого устанавливаете соединение. сравните сертификаты что отсылали и с помощью которого устанавливаете туннель.
0
4 / 3 / 0
Регистрация: 10.02.2016
Сообщений: 19
10.02.2016, 15:54
Dr_Elvis, защищенное соединение создается с помощью программы МагПро КриптоТуннель. С этим проблем как раз нет. Кроме того, подключение к веб-сервисам тоже работает, а ошибка возникает непосредственно при обращении к операциям веб-сервиса, уже после подключения.
0
6 / 6 / 0
Регистрация: 24.12.2015
Сообщений: 41
10.02.2016, 16:34
ViteG, то есть если отправить запрос, без подписи - всё работает корректно?
0
4 / 3 / 0
Регистрация: 10.02.2016
Сообщений: 19
10.02.2016, 16:50
Dr_Elvis, не понял о каком запросе речь. У 1С есть объект конфигурации WSОпределение. Он, как следует из названия, заведует определениями веб-сервисов. При его создании происходит подключение к веб-сервису, и в нем хранятся все точки подключения, интерфейсы, операции и т.п. Создание определения происходит с ошибкой, если не создано защищенное соединение средствами 1С или Криптотуннелем. Я сейчас пользуюсь МагПро Криптотуннель, соединение проходит прекрасно, определение создается, в нем хранятся все данные веб-сервиса. Но когда я пытаюсь вызвать какую-то операцию веб-сервиса возникает вот эта ошибка. Поэтому я и подозреваю, что дело в подписи. Там же указываются сведения о сертификате, организации и т.п.
0
6 / 6 / 0
Регистрация: 24.12.2015
Сообщений: 41
10.02.2016, 18:00
ViteG, а запрос exportOrgRegistry у вас проходит? вообще ошибка "Неверный идентификатор ИС" - связана с подключением. там же написано "ИС" а не поставщика данных. подпись бизнес данных осуществляется подписью поставщика, а установка соединения осуществляется посредством ЭЦП информационной системы(ИС). поэтому дело в установке соединения.
Дополню что запрос exportOrgRegistry - не требует подписи, попробуйте сначала его отправить.
1
4 / 3 / 0
Регистрация: 10.02.2016
Сообщений: 19
10.02.2016, 18:14
Dr_Elvis, спасибо за подсказку, буду рыть в этом направлении. Отпишусь, если дело и впрямь в сертификате.
0
13 / 13 / 0
Регистрация: 25.01.2016
Сообщений: 38
11.02.2016, 07:11
ViteG,
Попробуйте просто через SoapUI запрос отправить на exportOrgRegistry. Без подписи.
1
4 / 3 / 0
Регистрация: 10.02.2016
Сообщений: 19
11.02.2016, 07:52
Araney, спасибо! даже не знал, что такая штука есть. Тоже попробую.
0
3 / 3 / 1
Регистрация: 17.01.2015
Сообщений: 15
25.02.2016, 09:50
Цитата Сообщение от Araney Посмотреть сообщение
Да, класс генерирую просто:
>"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\svcutil" hcs-organizations-registry-service-8.5.0.2.wsdl hcs-nsi-service-8.5.0.2.wsdl *.xsd /async /n:*,dom.gosuslugi.schema.integration /edb /out:GKHService
Генерированный класс, я так понимаю ещё дорабатывается "ручками", не могу найти в своем классе объявление ISRequestHeader.
C#
1
2
3
4
5
6
7
8
9
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("svcutil", "4.6.1055.0")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://dom.gosuslugi.ru/schema/integration/8.5.0.2/organizations-registry/")]
    public partial class ISRequestHeader : HeaderType
    {
    }
0
13 / 13 / 0
Регистрация: 25.01.2016
Сообщений: 38
26.02.2016, 13:42
Нет, руками ничего не дорабатывал, т.к. версии часто меняются и хочется максимальной автоматизации обновления. Получаемым файлом просто заменяю текущий в проекте. ISRequestHeader вроде содержится в файле hcs-basetypes-8.5.0.4.xsd. Ссылка на него в hcs-organizations-registry-service-8.5.0.2.wsdl. Только в этом сервисе он используется. В остальных используется RequestHeader. Отличаются они наличием SenderID.
При формировании прокси класса текущей папка является та, в которой все файлы wsdl и xsd.
0
0 / 0 / 0
Регистрация: 10.12.2015
Сообщений: 18
26.02.2016, 15:48
Добрый день. Сегодня вышло обновление до 8.6.0.4. в нем были добавлены сервисы hcs-nsi-common и hcs-org-registry-common, в которые были перенесены методы не требующие SenderId. У меня по адресам эндпоинтов этих сервисов ( https://54.76.42.99:60045/ext-... rgRegistry и https://54.76.42.99:60045/ext-... /NsiCommon ) их nginx упорно выдает 404. У всех так?
0
3 / 3 / 0
Регистрация: 11.02.2016
Сообщений: 17
26.02.2016, 16:06
Цитата Сообщение от lonely_tramp Посмотреть сообщение
упорно выдает 404. У всех так?
Да. Видимо, Ланит что-то поломал. Хуже того, СИТ переведён на версию 8.6.0.4 и предыдущая реализация отказывается работать. Писать в поддержку, наверное нет смысла - очень долго отвечают.
0
0 / 0 / 0
Регистрация: 10.12.2015
Сообщений: 18
26.02.2016, 16:17
Springer, есть предположение что их необходимо дополнительно просить (3 недели ) предоставить доступ к этим сервисам. Т.к. при оформлении заявки на СИТ необходимо было указывать список требуемых сервисов. "Новые" сервисы появились, но т.к. в заявке мы их не указали, то у нас их и нет.

Может кто нибудь проверить это предположение? Для этого ранее необходимо было подавать заявку не на все сервисы, а сейчас проверить доступность незапрашиваемых.
0
3 / 3 / 0
Регистрация: 11.02.2016
Сообщений: 17
26.02.2016, 16:25
Цитата Сообщение от lonely_tramp Посмотреть сообщение
есть предположение что их необходимо дополнительно просить предоставить доступ
В нашей заявке были указаны пара сервисов. Помимо них, и остальные, не указанные в заявке не выдают 404 ошибку. К тому же, в пояснениях заявки указано, что доступ к Nsi и RegOrg предоставляется по умолчанию.
Всё-таки, криво развернули обновление СИТ. Кстати, на этот раз не приходило уведомление на почту о выпуске новой версии регламента и профилактических работах на СИТ.
0
0 / 0 / 0
Регистрация: 10.12.2015
Сообщений: 18
26.02.2016, 16:30
Цитата Сообщение от Springer Посмотреть сообщение
Помимо них, и остальные, не указанные в заявке не выдают 404 ошибку.
Ради интереса, не подскажешь каким образом ограничиваются (если ограничиваются) остальные? Можешь попробовать обратиться к ним и проверить? Спасибо.
0
3 / 3 / 0
Регистрация: 11.02.2016
Сообщений: 17
26.02.2016, 16:58
Цитата Сообщение от lonely_tramp Посмотреть сообщение
каким образом ограничиваются (если ограничиваются) остальные?
Тест на функции exportMSRSO из hcs-services, не указанной в заявке. Как и предполагалось, ошибка "AUT011009: Операция не разрешена". И короткий стек, начинающийся с "SoapFaultException: Operation EXPORT_MSRSO not allowed by EIS at ..."

Добавлено через 3 минуты
Цитата Сообщение от lonely_tramp Посмотреть сообщение
3 недели
Заработал NsiCommon
0
0 / 0 / 0
Регистрация: 10.12.2015
Сообщений: 18
26.02.2016, 17:10
Springer, спасибо. +1 монетка в копилку знаний)

Добавлено через 10 минут
Цитата Сообщение от Springer Посмотреть сообщение
Заработал NsiCommon
OrgRegistryCommon тоже работает, только к адресу необходимо добавить Common (в документации это не указано)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.02.2016, 17:10

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


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

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