AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 24.12.2021, 12:15   #1  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,940 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
? КриптоПро. Отправка данных в ГИИС ДМДК. Электронная подпись 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>
Но у принимающей XML-ки стороны есть требование обязательного префикса "ds:" в узлах подписи. Т.е. должно быть так (пример чужой !) :

Код:
<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  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
В данном случае префикс 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  
michel1971 is offline
michel1971
Участник
 
77 / 78 (3) ++++
Регистрация: 14.01.2011
Получилось префиксы добавить в блок подписи?
Старый 01.04.2022, 17:32   #4  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,940 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Да
Старый 04.04.2022, 10:43   #5  
michel1971 is offline
michel1971
Участник
 
77 / 78 (3) ++++
Регистрация: 14.01.2011
Цитата:
Сообщение от Logger Посмотреть сообщение
Да
кодом не поделитесь?
Старый 05.04.2022, 16:18   #6  
michel1971 is offline
michel1971
Участник
 
77 / 78 (3) ++++
Регистрация: 14.01.2011
вообщем получилось добавить...если в двух словах, то примерно так.. после 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  
Perplexx is offline
Perplexx
Участник
 
8 / 10 (1) +
Регистрация: 03.05.2016
Коллеги, добрый день, столкнулись с аналогичной проблемой, но решить пока не удалось.
Подскажите, в чем может быть дело. Делали аналогично вашему посту, но получили ошибку: «XML подпись недействительна. Не удается построить цепочку сертификатов для доверенного корневого центра.»

Пробовали сделать следующее:
Формируем подпись, получаем теги без префикса ds. Далее приводим xml согласно формату, добавляя к тегам подписи префикс ds, после чего переформируем подпись, добавляя xml элемент - теги подписи. После чего заменяем значение в теге ds:SignatureValue на новое.
Старый 22.11.2023, 16:53   #8  
michel1971 is offline
michel1971
Участник
 
77 / 78 (3) ++++
Регистрация: 14.01.2011
Цитата:
Сообщение от Perplexx Посмотреть сообщение
Не удается построить цепочку сертификатов для доверенного корневого центра
.
Проблема не в коде, а в цепочке сертификатов. Вам нужно добавить корневые доверенные сертификаты к Вашему сертификату.
Изображения
 
Старый 22.11.2023, 19:32   #9  
Perplexx is offline
Perplexx
Участник
 
8 / 10 (1) +
Регистрация: 03.05.2016
да вы правы, на самом деле ошибку про цепочку сертификатов нам сообщили ошибочно
на самом деле упёрлись в разницу фреймворков.

Принимающая сторона работает на Java, и ожидают в узлах подписи префиксы в виде "ds.signedinfo", который на .NET не предусмотрен.
Метод описанный выше, попытались применить, но хэши в signaturevalue и digestvalue, видимо, все еще формируется неверно. Т.к. теперь нам, со стороны контрагента, сообщают об ошибке в подписи.
Теги
xml, гиис дмдк, криптопро, элн

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
kurthatlevik: AX suggestion: XML Columns and XML indexes Blog bot DAX Blogs 0 28.10.2015 20:11
kurthatlevik: AX suggestion: XML Columns and XML indexes Blog bot DAX Blogs 0 28.08.2015 13:11
ax-erp: XML parser namespace error Blog bot DAX Blogs 0 20.11.2012 18:11
ax-erp: Ax2012 Validate XML and Show XML in form Blog bot DAX Blogs 0 17.10.2012 21:12
X++: Serializing Axapta Foundation Class instances as XML streams Blog bot DAX Blogs 0 04.06.2009 23:05
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 18:50.