logo
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline oleg_kashin  
#1 Оставлено : 4 августа 2019 г. 16:24:07(UTC)
oleg_kashin

Статус: Новичок

Группы: Участники
Зарегистрирован: 04.08.2019(UTC)
Сообщений: 4
Российская Федерация

Помогите разобраться с подписью запросов к сервису ГИС ЖКХ с использованием ключа по ГОСТ2012
Раньше использовался c ключом по ГОСТу2001 код на основе https://github.com/Good-...itan/signature-demo-net.

Переделка исходного приложения с заменой алгоритмов хэширования,подписи с XmlDsigGost3410UrlObsolete, XmlDsigGost3411UrlObsolete на XmlDsigGost3410_2012_256Url,XmlDsigGost3411_2012_256Url и заменой на Gost3410_2012_256CryptoServiceProvider дала странный результат
Пример подписанной xml:
Цитата:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:base="http://dom.gosuslugi.ru/schema/integration/base/" xmlns:hous="http://dom.gosuslugi.ru/schema/integration/house-management/" xmlns:xd="http://www.w3.org/2000/09/xmldsig#">
<soapenv:Header>
<base:RequestHeader>
<base:Date>2019-08-01T08:32:00</base:Date>
<base:MessageGUID>ac7f5e9d-4cf9-4429-ab08-6fa101a38929</base:MessageGUID>
<base:orgPPAGUID>6a211b53-14ba-4e5d-bff1-8904d043df3a</base:orgPPAGUID>
<base:IsOperatorSignature>true</base:IsOperatorSignature>
</base:RequestHeader>
</soapenv:Header>
<soapenv:Body>
<hous:exportHouseRequest Id="a06356a7e8bd4239ad69b3e9c949bca1" base:version="11.1.0.1">
<ds:Signature Id="xmldsig-3d1d7b14-2b97-4bbe-8339-9ccccab268e1" xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
<ds:SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256" />
<ds:Reference Id="xmldsig-3d1d7b14-2b97-4bbe-8339-9ccccab268e1-ref0" URI="#a06356a7e8bd4239ad69b3e9c949bca1">
<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="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256" />
<ds:DigestValue>C9l5Lyvrl3WzoRXt41#########################</ds:DigestValue>
</ds:Reference>
<ds:Reference URI="#xmldsig-3d1d7b14-2b97-4bbe-8339-9ccccab268e1-signedprops" Type="http://uri.etsi.org/01903#SignedProperties">
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411" />
<ds:DigestValue>L+T/JbBKI5lB5f1###################################</ds:DigestValue>
</ds:Reference>

</ds:SignedInfo>
<ds:SignatureValue Id="xmldsig-3d1d7b14-2b97-4bbe-8339-9ccccab268e1-sigvalue">H8hnQlUYXlbuH4Hhzlteu0kPI/usmt2Z4sLv2Nr0####################</ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>MIIL4zCCC5CgAwIBAgIQJmWyAISqNbZKeXNvjv8GKjAKBggqhQMHAQEDAjCCAYcxIjAgBgkqhkiG9w0BCQEWE2NhX3RlbnNvckB0ZW5zb3IucnUxGDAWBgUqhQNkARINMTAyNzYwMDc4Nzk5NDEaMBgGCCqFAwOBAwEBEgwwMDc2MDUwMTYwMzAxCzAJBgNVBAYTAlJVMTEwLwYDVQQIDCg3NiDQr9GA0L7Rgd.............</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
<ds:Object>
<xades:QualifyingProperties Target="#xmldsig-3d1d7b14-2b97-4bbe-8339-9ccccab268e1" xmlns:xades141="http://uri.etsi.org/01903/v1.4.1#" xmlns:xades="http://uri.etsi.org/01903/v1.3.2#">
<xades:SignedProperties Id="xmldsig-3d1d7b14-2b97-4bbe-8339-9ccccab268e1-signedprops">
<xades:SignedSignatureProperties>
<xades:SigningTime>2019-08-03T18:52:58.535+03:00</xades:SigningTime>
<xades:SigningCertificate>
<xades:Cert>
<xades:CertDigest>
<ds:DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256" />
<ds:DigestValue>iHgldkUfYZurm1/OAbbFFDq#####################=</ds:DigestValue>
</xades:CertDigest>
<xades:IssuerSerial>
<ds:X509IssuerName>1.2.840.113549.1.9.1=ca_tensor@tensor.ru,1.2.643.100.1=1027600787994,1.2.643.3.131.1.1=007605016030,C=RU,ST=76 Ярославская область,L=г. Ярославль,STREET=Московский проспект д.12,OU=Удостоверяющий центр,O=ООО \"КОМПАНИЯ \"ТЕНЗОР\",CN=ООО \"КОМПАНИЯ \"ТЕНЗОР\"</ds:X509IssuerName>
<ds:X509SerialNumber>5103869613250..................</ds:X509SerialNumber>
</xades:IssuerSerial>
</xades:Cert>
</xades:SigningCertificate>
</xades:SignedSignatureProperties>
</xades:SignedProperties>
</xades:QualifyingProperties>
</ds:Object>
</ds:Signature>
<hous:FIASHouseGuid>23159e35-673f-4b45-952f-b80bbd5f4110</hous:FIASHouseGuid>
</hous:exportHouseRequest>
</soapenv:Body>
</soapenv:Envelope>


Запрос сервисами принимается, но при получении результата выходит ошибка "Ошибка формата подписи запроса".Не очень понимаю в чем проблема, но кажется в выделенном выше Reference - откуда то берется gost3411.
По документации ГИС ЖКХ подпись должна быть по примеру:
Цитата:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<h:RequestHeader xmlns="http://dom.gosuslugi.ru/schema/integration/8.5.0.4/" xmlns:h="http://dom.gosuslugi.ru/schema/integration/8.5.0.4/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!-- Заголовок, содержащий информацию о поставщике данных и сообщении-->
<Date>2016-01-29T09:29:29.5033083+03:00</Date>
<MessageGUID>${=java.util.UUID.randomUUID()}</MessageGUID>
<orgPPAGUID>a013da6b-fd11-4b20-8903-dbbcb22ff221</orgPPAGUID>
</h:RequestHeader>
</s:Header>
<s:Body xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<exportNsiListRequest xmlns="http://dom.gosuslugi.ru/schema/integration/8.5.0.4/nsi/" Id="foo">
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="xmldsig-3f222eb1-bfe9-4da6-a121-450a984fc85c">
<!-- Элемент, содержащий электронную подпись поставщика данных -->
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
<ds:SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256"/>
<ds:Reference URI="#foo">
<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="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256"/>
<ds:DigestValue>RML7HeI83whzrRjK3S02X4MlVGrSIIWHVC3x3la+IZc=</ds:DigestValue>
</ds:Reference>
<ds:Reference URI="#xmldsig-3f222eb1-bfe9-4da6-a121-450a984fc85c-signedprops" Type="http://uri.etsi.org/01903#SignedProperties">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
</ds:Transforms>
<ds:DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256"/>
<ds:DigestValue>oYIU+RWjn9wSku3ixrJy48TMqRU4geh9HE4LLL7lmhk=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>alQ98eCzqfxzOM66D9oqXqibLpT7n9epRju90+98TVDCh1Pyu365QcBWbd8mYMpzvb5nhYdhK5YMsgZQ8y/2EA==</ds:SignatureValue>
<ds:KeyInfo Id="xmldsig-61b74cb4-68b2-439c-9533-8668dc82d1dd">
<ds:X509Data xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:X509Certificate>MIIEOzCCA+igAwIBAgITfAAAIl69xb6XX81K7wABAAAiXjAKBggqhQMHAQEDAjCCAQoxGDAWBgUq
hQNkARINMTIzNDU2Nzg5MDEyMzEaMBgGCCqFAwOBAwEBEgwwMDEyMzQ1Njc4OTAxLzAtBgNVBAkM
JtGD0LsuINCh0YPRidGR0LLRgdC60LjQuSDQstCw0Lsg0LQuIDE4MQswCQYDVQQGEwJSVTEZMBcG
A1UECAwQ0LMuINCc0L7RgdC60LLQsDEVMBMGA1UEBwwM0JzQvtGB0LrQstCwMSUwIwYDVQQKDBzQ
ntCe0J4gItCa0KDQmNCf0KLQni3Qn9Cg0J4iMTswOQYDVQQDDDLQotC10YHRgtC+0LLRi9C5INCj
0KYg0J7QntCeICLQmtCg0JjQn9Ci0J4t0J/QoNCeIjAeFw0xOTAzMjYxNTQ2MDlaFw0yMDAzMjYx
NTU2MDlaMBExDzANBgNVBAMMBnF3ZXF3ZTBmMB8GCCqFAwcBAQEBMBMGByqFAwICJAAGCCqFAwcB
AQICA0MABEAITPXfzlPyUvEdyIu9xdiJ3/pyWoyPpJGSnpB2tcOmDSKgY820V6aGKoCRbD+7ERfy
Fmj7mDagaPpCmE4gh77go4ICFTCCAhEwDgYDVR0PAQH/BAQDAgTwMBMGA1UdJQQMMAoGCCsGAQUF
BwMCMB0GA1UdDgQWBBTmibcoo8HRfZ6tV6Gqye6Y7slQVjAfBgNVHSMEGDAWgBSbhV77gdxNWQdR
Y8++39osf8lEPDCBzAYDVR0fBIHEMIHBMIG+oIG7oIG4hoG1aHR0cDovL3Rlc3Rnb3N0MjAxMi5j
cnlwdG9wcm8ucnUvQ2VydEVucm9sbC8hMDQyMiEwNDM1ITA0NDEhMDQ0MiEwNDNlITA0MzIhMDQ0
YiEwNDM5JTIwITA0MjMhMDQyNiUyMCEwNDFlITA0MWUhMDQxZSUyMCEwMDIyITA0MWEhMDQyMCEw
NDE4ITA0MWYhMDQyMiEwNDFlLSEwNDFmITA0MjAhMDQxZSEwMDIyKDEpLmNybDCB2gYIKwYBBQUH
AQEEgc0wgcowRAYIKwYBBQUHMAKGOGh0dHA6Ly90ZXN0Z29zdDIwMTIuY3J5cHRvcHJvLnJ1L0Nl
cnRFbnJvbGwvcm9vdDIwMTguY3J0MD8GCCsGAQUFBzABhjNodHRwOi8vdGVzdGdvc3QyMDEyLmNy
eXB0b3Byby5ydS9vY3NwMjAxMmcvb2NzcC5zcmYwQQYIKwYBBQUHMAGGNWh0dHA6Ly90ZXN0Z29z
dDIwMTIuY3J5cHRvcHJvLnJ1L29jc3AyMDEyZ3N0L29jc3Auc3JmMAoGCCqFAwcBAQMCA0EAshoi
XbdKE+B6G5+gvvb7XamJAjsQPfDbzKAbotvhfYn7e9fmBKs6JugN8/4RR+P20wblrW3lcSsFPATG
rX+ZKw==</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
<ds:Object>
<xades:QualifyingProperties xmlns:xades="http://uri.etsi.org/01903/v1.3.2#" Target="#xmldsig-3f222eb1-bfe9-4da6-a121-450a984fc85c">
<xades:SignedProperties Id="xmldsig-3f222eb1-bfe9-4da6-a121-450a984fc85c-signedprops">
<xades:SignedSignatureProperties>
<xades:SigningTime>2019-04-18T12:39:59.239+03:00</xades:SigningTime>
<xades:SigningCertificate>
<xades:Cert>
<xades:CertDigest>
<ds:DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256"/>
<ds:DigestValue>HNGQRbX8zzFa9F9Qg7jOO8urNG93+9AYuyEG9dVfgUA=</ds:DigestValue>
</xades:CertDigest>
<xades:IssuerSerial>
<ds:X509IssuerName>cn=Тестовый УЦ ООО \"КРИПТО-ПРО\",o=ООО \"КРИПТО-ПРО\",l=Москва,st=г. Москва,c=RU,street=ул. Сущёвский вал д.18,1.2.643.3.131.1.1=001234567890,1.2.643.100.1=1234567890123</ds:X509IssuerName>
<ds:X509SerialNumber>2765292450303474073288100094019649762249155166</ds:X509SerialNumber>
</xades:IssuerSerial>
</xades:Cert>
</xades:SigningCertificate>
</xades:SignedSignatureProperties>
</xades:SignedProperties>
</xades:QualifyingProperties>
</ds:Object>
</ds:Signature>
<!--Элемент, описывающий бизнес-данные-->
</exportNsiListRequest>
</s:Body>
</s:Envelope>



Пробовал подписывать xml в соответствии с примерами по КриптоПро .net из \simple\Xml\cs\SignSmevRequest.cs и SignNode.cs
Код типа
Цитата:

// Создаем новый документ XML.
XmlDocument doc = new XmlDocument();

// Читаем документ из файла.
doc.Load(new XmlTextReader(FileName));

// Создаём объект SmevSignedXml - наследник класса SignedXml с перегруженным GetIdElement
// для корректной обработки атрибута wsu:Id.
SmevSignedXml signedXml = new SmevSignedXml(doc);

// Задаём ключ подписи для документа SmevSignedXml.
signedXml.SigningKey = Certificate.PrivateKey;

// Создаем ссылку на подписываемый узел XML. В данном примере и в методических
// рекомендациях СМЭВ подписываемый узел soapenv:Body помечен идентификатором "body".
Reference reference = new Reference();
reference.Uri = "#a06356a7e8bd4239ad69b3e9c949bca1";

// Задаём алгоритм хэширования подписываемого узла - ГОСТ Р 34.11-94. Необходимо
// использовать устаревший идентификатор данного алгоритма, т.к. именно такой
// идентификатор используется в СМЭВ.
#pragma warning disable 612
//warning CS0612: 'CryptoPro.Sharpei.Xml.CPSignedXml.XmlDsigGost3411UrlObsolete' is obsolete
reference.DigestMethod = CryptoPro.Sharpei.Xml.CPSignedXml.XmlDsigGost3411_2012_256Url;
#pragma warning restore 612

// Добавляем преобразование для приведения подписываемого узла к каноническому виду
// по алгоритму http://www.w3.org/2001/10/xml-exc-c14n# в соответствии с методическими
// рекомендациями СМЭВ.
// XmlDsigExcC14NTransform c14 = new XmlDsigExcC14NTransform();XmlDsigCanonicalizationUrl
reference.AddTransform(new XmlDsigExcC14NTransform());
reference.AddTransform(new XmlDsigEnvelopedSignatureTransform());

// Добавляем ссылку на подписываемый узел.
signedXml.AddReference(reference);

// Задаём преобразование для приведения узла ds:SignedInfo к каноническому виду
// по алгоритму http://www.w3.org/2001/10/xml-exc-c14n# в соответствии с методическими
// рекомендациями СМЭВ.
signedXml.SignedInfo.CanonicalizationMethod = SignedXml.XmlDsigExcC14NTransformUrl;

// Задаём алгоритм подписи - ГОСТ Р 34.10-2001. Необходимо использовать устаревший
// идентификатор данного алгоритма, т.к. именно такой идентификатор используется в
// СМЭВ.
#pragma warning disable 612
//warning CS0612: 'CryptoPro.Sharpei.Xml.CPSignedXml.XmlDsigGost3411UrlObsolete' is obsolete
signedXml.SignedInfo.SignatureMethod = CryptoPro.Sharpei.Xml.CPSignedXml.XmlDsigGost3410_2012_256Url;
#pragma warning restore 612
// Создаем объект KeyInfo.
KeyInfo keyInfo = new KeyInfo();

// Добавляем сертификат в KeyInfo
keyInfo.AddClause(new KeyInfoX509Data(Certificate));

// Добавляем KeyInfo в SignedXml.
signedXml.KeyInfo = keyInfo;
// Вычисляем подпись.
signedXml.ComputeSignature();

// Получаем представление подписи в виде XML.
XmlElement xmlDigitalSignature = signedXml.GetXml();

var signedDataContainer = signedXml.GetIdElement(doc, "a06356a7e8bd4239ad69b3e9c949bca1");
signedDataContainer.InsertBefore(doc.ImportNode(xmlDigitalSignature, true), signedDataContainer.FirstChild);




Получаться что то типа
Цитата:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:base="http://dom.gosuslugi.ru/schema/integration/base/" xmlns:hous="http://dom.gosuslugi.ru/schema/integration/house-management/" xmlns:xd="http://www.w3.org/2000/09/xmldsig#">
<soapenv:Header>
<base:RequestHeader>
<base:Date>2019-08-01T08:32:00</base:Date>
<base:MessageGUID>ac7f5e9d-4cf9-4429-ab08-6fa101a38968</base:MessageGUID>
<base:orgPPAGUID>6a211b###############################</base:orgPPAGUID>
<base:IsOperatorSignature>true</base:IsOperatorSignature>
</base:RequestHeader>
</soapenv:Header>
<soapenv:Body>
<hous:exportHouseRequest Id="a06356a7e8bd4239ad69b3e9c949bca1" base:version="11.1.0.1">
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
<SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256" />
<Reference URI="#a06356a7e8bd4239ad69b3e9c949bca1">
<Transforms>
<Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
</Transforms>
<DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256" />
<DigestValue>9G3SK46aX/tJ################</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>zBt2vj62RRGNVHX8CBhuJ2le4lez6QWhO##############################
</SignatureValue>
<KeyInfo>
<X509Data>
<X509Certificate>MIIL4zCCC5CgAwIBAgIQJmWyAISqNbZKeXNvjv8GKjAKBggqhQMHAQEDAjCCAY/.....
</X509Certificate>
</X509Data>
</KeyInfo>
</Signature>
<hous:FIASHouseGuid>23159e35-673f-4b45-952f-b80bbd5f4110</hous:FIASHouseGuid>
</hous:exportHouseRequest>
</soapenv:Body>
</soapenv:Envelope>

Нет в xml <ds:Object> и соответственно QualifyingProperties,SignedProperties и т.д. xml естественно не проходит с той же ошибкой
Подскажите как создаются это объекты или кто делал рабочий пример подписи запроса в ГИС ЖКХ с ключом ГОСТ2001????Ключи по ГОСТ2001 скоро закончатся...

Offline two_oceans  
#2 Оставлено : 5 августа 2019 г. 11:44:28(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 537
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 30 раз
Поблагодарили: 118 раз в 113 постах
Добрый день.
Суммируя Ваш Вопрос:
1) В первом примере на основе примера подписания xades-bes для гис жкх с гитхаба меняется алгоритм хэша первого референса (от подписываемого текст) и подписи, хэш сертификата, но не меняется алгоритм хэша второго референса (данные xades). Вам нужно найти в исходнике место, задается алгоритм хэша второго референса и также поменять его на гост-2012. После этого должно все получиться по примеру.

Код:
Предположительно Вы поменяли на гост-2012 тут:
signature-demo-net/blob/master/Xades/Implementations/GostCryptoProvider.cs
и осталось поменять вот здесь
signature-demo-net/blob/master/Xades-master/Source/Library/XadesSignedXml.cs
в AddXadesObject прописан явно алгоритм второго референса.


2) С подписанием через СМЭВ тоже все логично: СМЭВ не требует подписи формата xades-bes поэтому второй референс и ds:Object отсутствуют в подписи. Нужно создать XadesObject, добавить его в подпись. Подробнее в приведенной Вами ссылке на гитхаб:
Код:
signature-demo-net/blob/master/Xades/XadesBesSignedXml.cs
  public void ComputeSignature(X509Certificate2 certificate, string privateKeyPassword)
signature-demo-net/blob/master/Xades/Implementations/GostCryptoProvider.cs
  public XadesObject GetXadesObject(XadesInfo xadesInfo, string signatureId)
signature-demo-net/blob/master/Xades-master/Source/Library/XadesSignedXml.cs
  public void AddXadesObject(XadesObject xadesObject)

Offline oleg_kashin  
#3 Оставлено : 6 августа 2019 г. 22:39:00(UTC)
oleg_kashin

Статус: Новичок

Группы: Участники
Зарегистрирован: 04.08.2019(UTC)
Сообщений: 4
Российская Федерация

Автор: two_oceans Перейти к цитате
Добрый день.
Суммируя Ваш Вопрос:
1) В первом примере на основе примера подписания xades-bes для гис жкх с гитхаба меняется алгоритм хэша первого референса (от подписываемого текст) и подписи, хэш сертификата, но не меняется алгоритм хэша второго референса (данные xades). Вам нужно найти в исходнике место, задается алгоритм хэша второго референса и также поменять его на гост-2012. После этого должно все получиться по примеру.

Код:
Предположительно Вы поменяли на гост-2012 тут:
signature-demo-net/blob/master/Xades/Implementations/GostCryptoProvider.cs
и осталось поменять вот здесь
signature-demo-net/blob/master/Xades-master/Source/Library/XadesSignedXml.cs
в AddXadesObject прописан явно алгоритм второго референса.


2) С подписанием через СМЭВ тоже все логично: СМЭВ не требует подписи формата xades-bes поэтому второй референс и ds:Object отсутствуют в подписи. Нужно создать XadesObject, добавить его в подпись. Подробнее в приведенной Вами ссылке на гитхаб:
Код:
signature-demo-net/blob/master/Xades/XadesBesSignedXml.cs
  public void ComputeSignature(X509Certificate2 certificate, string privateKeyPassword)
signature-demo-net/blob/master/Xades/Implementations/GostCryptoProvider.cs
  public XadesObject GetXadesObject(XadesInfo xadesInfo, string signatureId)
signature-demo-net/blob/master/Xades-master/Source/Library/XadesSignedXml.cs
  public void AddXadesObject(XadesObject xadesObject)



По 1) да действительно все так и есть как Вы описали - даже не знаю почему AddXadesObject в XadesSignedXml.cs пропустил reference.DigestMethod = "http://www.w3.org/2001/04/xmldsig-more#gostr3411" а в GostCryptoProvider.cs все исправил
По 2) я так и понял что в итоге все получится почти также как и в п.1)
Спасибо)
Offline oleg_kashin  
#4 Оставлено : 11 августа 2019 г. 17:06:31(UTC)
oleg_kashin

Статус: Новичок

Группы: Участники
Зарегистрирован: 04.08.2019(UTC)
Сообщений: 4
Российская Федерация

короче прошла еще неделя)
Указанный второй reference signature-demo-net/blob/master/Xades-master/Source/Library/XadesSignedXml.cs поправил при создании Xadesobject - теперь <signature> в xml ничем принципиально не отличается от примера с сайта ГИС ЖКХ, но запрос опять не проходит с ошибкой "Ошибка формата подписи запроса".
Писал в поддержку ГИС ЖКХ - сказали что неверно рассчитаны "DigestValue" - как я понимаю в <xades:CertDigest>.
Т.е. получается DigestValue рассчитан по алгоритмам не к ключу ГОСТ2012 - где то не поменял ссылки? Такое вообще может быть, т.к. ошибок при подписи не возникает. Например указываешь XmlDsigGost3410UrlObsolete вместо XmlDsigGost3410_2012_256Url с ключом 2012 года - ошибка естественно есть о том что не поддерживает.
Может немного обнаглел, но поскажете в какую сторону смотреть ошибку, которая может быть при расчете DigestValue?
example GIS ZhKKh.xml (6kb) загружен 2 раз(а). mojj zapros.xml (9kb) загружен 2 раз(а).
В целом подпись то получается как по примеру ГИС ЖКХ
Offline two_oceans  
#5 Оставлено : 12 августа 2019 г. 6:10:47(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 537
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 30 раз
Поблагодарили: 118 раз в 113 постах
Автор: oleg_kashin Перейти к цитате
...Писал в поддержку ГИС ЖКХ - сказали что неверно рассчитаны "DigestValue" - как я понимаю в <xades:CertDigest>. ...Может немного обнаглел, но поскажете в какую сторону смотреть ошибку, которая может быть при расчете DigestValue? example GIS ZhKKh.xml (6kb) загружен 2 раз(а). mojj zapros.xml (9kb) загружен 2 раз(а).
В целом подпись то получается как по примеру ГИС ЖКХ
В подписи xades целых три DigestValue, какой из них не идет большой вопрос.

Файлы посмотрю, но у меня похоже подобная проблема (хотя и не с гис жкх)... SignatureValue по гост-2012 от тестовых запросов проверку проходит, а DigestValue по гост-2012 из тестовых запросов проверку не проходит. Уже и сохранял, то что идет на вычисление digest в отдельный файл, считал утилитой cpverify - совпадает с тем, что выдает моя программа и не совпадает с тем что в файле. Проверочные значения из самого гост-2012 и утилита и моя программа считает верно. Выглядит как будто текст на вычисление идет неверный.

Сверял текст на вычисление digest с тестовой программкой эксклюзивной каноникализации на .NET - текст тоже совпадает, при добавлении в архив контрольные суммы файлов с полученными фрагментами совпадают, то есть каких-то отличающихся непечатных символов нет. Загадка прям. Уже была шальная мысль текст перевернуть до полного счастья, но пока не проверял))) Остается надеяться, что совместными усилиями сдвинем вопрос с мертвой точки, так как у меня сертификат ис по гост-2001 истекает уже через неделю (внезапно).

UPD: Файл Вашего запроса посмотрел (для референсов воспользовался "эталонной" программкой эксклюзивной каноникализации на .NET) - DigestValue от декодированного из Base64 сертификата совпадает (с точностью до endian),
от второго референса совпадает (если поставить PreserveWhitespace = false и с точностью до endian), от первого референса не совпадает (брал разные варианты PreserveWhitespace и endian), SignatureValue проверку не прошло (SignatureValue скорее всего из-за того что моя программа убрала переводы строк, но не убрала пробелы в SignedInfo, "эталонной" программкой тут сложно воспользоваться, чуть позже перекомпилирую с выкидыванием пробелов и перепроверю). В целом конечно рекомендация постараться не делать отступы пробелами или табуляцией перед тегами и лишние переводы строк (если это позволит гис жкх), тогда будет без разницы значение параметра PreserveWhitespace. Вот что у меня вышло по текстам:
Про endian - я уже сам запутался какой нужен. По стадарту вроде как нужен big endian, а КриптоПро возвращает little endian. Для смены берется некодированный хэш как массив байтов и делается reverse массива, потом кодируется в base64. То есть когда все с точностью до endian будет совпадать, но гис ругаться на неверное значение, то можно еще попробовать сменить endian. А пока не совпадает переворачивать лишний раз не нужно, так как с гост-2001 же работало.

В соседней теме https://www.cryptopro.ru...&m=105596#post105596 мне посоветовали включить лог трансформов, мне совет не очень пригодился, но Вам может помочь сравнить значения текста идущего на вычисление Digest.

Отредактировано пользователем 12 августа 2019 г. 11:35:43(UTC)  | Причина: Не указана

Offline two_oceans  
#6 Оставлено : 13 августа 2019 г. 10:32:45(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 537
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 30 раз
Поблагодарили: 118 раз в 113 постах
По примеру получается еще интереснее, пример из первого сообщения хотя бы проходит проверку SignatureValue, в то же время в последнем Вашем сообщении приложен судя по значению подписи и значениям хэшей тот пример в виде файла, но уже с кучей табуляций и переводов строки, и проверка signatureValue уже не проходит. Поэтому желательно не копировать через буфер из какого-то просмотрщика, а записать как бинарный массив байтов в файл прямо в программе, где формируете подпись, так результат диагностики будет гораздо точнее. Аналогично с примером - желательно сохранить в точности как прислала поддержка.

Отредактировано пользователем 13 августа 2019 г. 10:34:48(UTC)  | Причина: Не указана

Offline oleg_kashin  
#7 Оставлено : 13 августа 2019 г. 21:39:21(UTC)
oleg_kashin

Статус: Новичок

Группы: Участники
Зарегистрирован: 04.08.2019(UTC)
Сообщений: 4
Российская Федерация

Автор: two_oceans Перейти к цитате

В соседней теме https://www.cryptopro.ru...&m=105596#post105596 мне посоветовали включить лог трансформов, мне совет не очень пригодился, но Вам может помочь сравнить значения текста идущего на вычисление Digest.


Пошел осознавать и обдумывать, благо сертификат истекает в декабре и пока не так припекает. Кстати форматирование - все результат деятельности примера с гитхаба,т.е. выходную xml руками не форматировал ни разу, чего не скажу про пример с сайта ГИС ЖКХ - его в xml не нашел - только пример вытащил из Word документа - Альбом ТТФ (https://dom.gosuslugi.ru/filestore/publicDownloadServlet?context=contentmanagement&uid=d6555fd7-0903-4efa-9b60-d37faf1484fd&mode=view)
Кстати когда пробовал примеры из \simple\Xml\cs\SignSmevRequest.cs и SignNode.cs на выходе не форматированный xml - не оч понял откуда в примере с гита форматирование на выходе - короче с каждым разом все интереснее и интереснее)
Автор: two_oceans Перейти к цитате

(для референсов воспользовался "эталонной" программкой эксклюзивной каноникализации на .NET)

Если можно просветите побробнее что это?




Offline two_oceans  
#8 Оставлено : 14 августа 2019 г. 7:13:40(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 537
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 30 раз
Поблагодарили: 118 раз в 113 постах
Автор: oleg_kashin Перейти к цитате
короче с каждым разом все интереснее и интереснее
Просто не то слово. Сейчас еще в ту тему отпишу какие фокусы выяснились со смэв 3 и гост-2012.

Автор: oleg_kashin;105836
Автор: two_oceans Перейти к цитате
(для референсов воспользовался "эталонной" Перейти к цитате
Если можно просветите побробнее что это?
Предыстория.
Вот ссылка на оригинальную тему с программой, за 2 года побочных эффектов не замечено. Я почему-то читал клон этой темы на другом форуме без сообщения с исходником, но пусть тут будет оригинальная тема https://www.cryptopro.ru....aspx?g=posts&t=8560

Замечу только, что когда делается каноникализация для ЭЦП вообще и SOAP в частности, некоторые пункты процедуры каноникализации срабатывают вхолостую, потому что стандарт ЭЦП регламентирует нормализацию переводов строк, то есть в норме на каноникализацию никогда не придет символ с кодом 13. Сам по себе стандарт xml разрешает из символов до пробела (кода 32) только переводы строк и табуляцию (коды 9,10,13) Далее стандарт Соап накладывает ограничение на инструкции обработки и внешние "ссылки на разделы", то есть они тоже не придут на каноникализацию при подписи соап запросов. Остаются только символы 9 и 10 с которыми куча проблем. Если в исходном запросе нет символов 9, 10, 13 (так как при нормализации переводов строк 13 меняется на 10), то подписание и проверка проходят гораздо проще.

Отредактировано пользователем 14 августа 2019 г. 7:51:29(UTC)  | Причина: Не указана

RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.