24.12.2021, 12:15 | #1 |
Участник
|
КриптоПро. Отправка данных в ГИИС ДМДК. Электронная подпись XML
Привет всем.
Коллеги, а кто-нибудь делал в аксапте отправку данных в ГИИС ДМДК через криптопро? Мы тут занялись вопросом. Выявилась странная проблема с префиксами в XML. Не получается пока решить. Для XML-документа формируем подпись (XMLDSig) классом XmlSignatureManager. Все устраивает кроме одного - XML-узлы подписи не имеют явного префикса "ds:". Т.е. получается примерно так (пример чужой !) : Код: <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=""> <DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256" /> <DigestValue>QRYybUcBjRVBX8w3BRwnEVUJdW8tTjnehY9vmT+Tg6g=</DigestValue> </Reference> </SignedInfo> <SignatureValue>FIU25fwFADwAw1kEDuqQXzeSWk/0ABqN7bWk4kQWp5Z8CH/BvZUZhJ7dEVXogjY15cQf22+XXKooWAcKXgFisA==</SignatureValue> <KeyInfo> <X509Data> <X509Certificate>MIIBljCCAUOgAwIBAgIFALIb0lwwCgYIKoUDBwEBAwIwMTELMAkGA1UEBhMCUlUxEjAQBgNVBAoMCUNyeXB0b1BybzEOMAwGA1UEAwwFQWxpYXMwHhcNMTgxMTE5MTEwMDMyWhcNMTkxMTE5MTEwMDMyWjAxMQswCQYDVQQGEwJSVTESMBAGA1UECgwJQ3J5cHRvUHJvMQ4wDAYDVQQDDAVBbGlhczBmMB8GCCqFAwcBAQEBMBMGByqFAwICJAAGCCqFAwcBAQICA0MABEA2pfIf43pd1HJ5smWmRiL1ygJIkoEk3705P9KegQWMBjmrgVBiLsihYK9mCGvcSUsSEhiGP+FqXL0IxBcry4tHozswOTAOBgNVHQ8BAf8EBAMCA+gwEwYDVR0lBAwwCgYIKwYBBQUHAwIwEgYDVR0TAQH/BAgwBgEB/wIBBTAKBggqhQMHAQEDAgNBAPnIaU3AZpeDoq36pqQhWwHe1RKb7daWndt7j0zrB36oaH55auxMfrWZPzY8lFeUBPylh5vS/iMKMwo76lyJPm8=</X509Certificate> </X509Data> </KeyInfo> </Signature> Код: <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> <ds:SignedInfo> <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></ds:CanonicalizationMethod> <ds:SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256"></ds:SignatureMethod> <ds:Reference> <ds:DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256"></ds:DigestMethod> <ds:DigestValue>aKEnYi7xyFtVN9awhy/jdmIkKa3l6TXLMPUL/On4gwU=</ds:DigestValue> </ds:Reference> </ds:SignedInfo> <ds:SignatureValue>IsjAgckh/80IR8armGi3+b25gLGht0dFxZ1jDxkJlOzD/VYqD76KYMFAEltBTBRdxe4XNxm8g23rO5iQiJ2YiA==</ds:SignatureValue> <ds:KeyInfo> <ds:X509Data> <ds:X509Certificate>MIIBljCCAUOgAwIBAgIFALIb0lwwCgYIKoUDBwEBAwIwMTELMAkGA1UEBhMCUlUxEjAQBgNVBAoMCUNyeXB0b1BybzEOMAwGA1UEAwwFQWxpYXMwHhcNMTgxMTE5MTEwMDMyWhcNMTkxMTE5MTEwMDMyWjAxMQswCQYDVQQGEwJSVTESMBAGA1UECgwJQ3J5cHRvUHJvMQ4wDAYDVQQDDAVBbGlhczBmMB8GCCqFAwcBAQEBMBMGByqFAwICJAAGCCqFAwcBAQICA0MABEA2pfIf43pd1HJ5smWmRiL1ygJIkoEk3705P9KegQWMBjmrgVBiLsihYK9mCGvcSUsSEhiGP+FqXL0IxBcry4tHozswOTAOBgNVHQ8BAf8EBAMCA+gwEwYDVR0lBAwwCgYIKwYBBQUHAwIwEgYDVR0TAQH/BAgwBgEB/wIBBTAKBggqhQMHAQEDAgNBAPnIaU3AZpeDoq36pqQhWwHe1RKb7daWndt7j0zrB36oaH55auxMfrWZPzY8lFeUBPylh5vS/iMKMwo76lyJPm8=</ds:X509Certificate> </ds:X509Data> </ds:KeyInfo> </ds:Signature> Гугление выдало https://www.cryptopro.ru/forum2/defa...=posts&t=15149 https://stackoverflow.com/questions/...ture-ds-prefix https://overcoder.net/q/454914/%D0%B...D0%B5%D0%BD-ds из первой ссылки как бы следует что это особенность реализации XMLDSig на уровне NET-классов подписи - тупо создает узлы без префиксов, более того, даже если Вы заранее подготовите XML с узлом SignedInfo, укажете в нём префиксы, то при выполнении Microsoft.Dynamics.XmlSign.Xades.ExtendedSignedXml.ComputeSignature() они будут удалены. Т.е. как бы и поделать тут ничего нельзя, кроме как самому написать формирование подписи. Может быть есть какой-то обходной путь или кто-то уже решал такую проблему ? P.S. Ax2012 R3 |
|
24.12.2021, 15:44 | #2 |
Участник
|
В данном случае префикс ds - это ссылка на XML namespace. Тут засада в том, что если в XML-документе используется только один namespace, то по умолчанию сам namespace идет без префикса, и все теги генерятся без префикса. Я в каком-то другом кейсе обходил это так: в пустом XML-документе указывал два разных namespace-а, по умолчанию - левый, а второй с префиксом - тот, который мне собственно был нужен. Затем генерил XML-документ с привязкой тегов к нужному namespace-у, а в конце ненужный namespace удалял. В итоге получался XML-документ с одним namespace-ом, но использующий для него префикс. Дело было давно, что щас сейчас готовый кусок кода, к сожалению, сходу не найду.
|
|
|
За это сообщение автора поблагодарили: AlGol (4), Vadik (1), trud (2), Logger (10). |
01.04.2022, 17:30 | #3 |
Участник
|
Получилось префиксы добавить в блок подписи?
|
|
01.04.2022, 17:32 | #4 |
Участник
|
Да
|
|
04.04.2022, 10:43 | #5 |
Участник
|
|
|
05.04.2022, 16:18 | #6 |
Участник
|
вообщем получилось добавить...если в двух словах, то примерно так.. после ComputeSignature в методе sign класса XmlSignatureManager
X++: ......
xmlDigitalSignature = signedXml.GetXml();
XmlSignatureManager::addPrefix("ds", xmlDigitalSignature);
signedXml.LoadXml(xmlDigitalSignature);
signedInfo = signedXml.get_SignedInfo();
references = signedInfo.get_References();
references.Clear();
signedXml.ComputeSignature();
recomputedSignature = System.Convert::ToBase64String(signedXml.get_SignatureValue());
XmlSignatureManager::replaceSignature(xmlDigitalSignature, recomputedSignature);
.... |
|
20.11.2023, 18:50 | #7 |
Участник
|
Коллеги, добрый день, столкнулись с аналогичной проблемой, но решить пока не удалось.
Подскажите, в чем может быть дело. Делали аналогично вашему посту, но получили ошибку: «XML подпись недействительна. Не удается построить цепочку сертификатов для доверенного корневого центра.» Пробовали сделать следующее: Формируем подпись, получаем теги без префикса ds. Далее приводим xml согласно формату, добавляя к тегам подписи префикс ds, после чего переформируем подпись, добавляя xml элемент - теги подписи. После чего заменяем значение в теге ds:SignatureValue на новое. |
|
22.11.2023, 16:53 | #8 |
Участник
|
Проблема не в коде, а в цепочке сертификатов. Вам нужно добавить корневые доверенные сертификаты к Вашему сертификату.
|
|
22.11.2023, 19:32 | #9 |
Участник
|
да вы правы, на самом деле ошибку про цепочку сертификатов нам сообщили ошибочно
на самом деле упёрлись в разницу фреймворков. Принимающая сторона работает на Java, и ожидают в узлах подписи префиксы в виде "ds.signedinfo", который на .NET не предусмотрен. Метод описанный выше, попытались применить, но хэши в signaturevalue и digestvalue, видимо, все еще формируется неверно. Т.к. теперь нам, со стороны контрагента, сообщают об ошибке в подписи. |
|
Теги |
xml, гиис дмдк, криптопро, элн |
|
|