Статус: Новичок
Группы: Участники
Зарегистрирован: 31.07.2018(UTC) Сообщений: 9 Откуда: Екб Поблагодарили: 1 раз в 1 постах
|
Добрый день! Есть три подписанных xml-файла. В первом файле значения текстовых узлов не содержат символов перевода каретки (CR, 
, \r, и т.д.): Код:<?xml version="1.0" encoding="utf-8"?><Root v="2" a="1"><Value>part1part2</Value></Root>
Во втором такой символ встречается: Код:<?xml version="1.0" encoding="utf-8"?><Root v="2" a="1"><Value>part1
part2</Value></Root>
В третьем есть он же, но в каноническом виде: Код:<?xml version="1.0" encoding="utf-8"?><Root v="2" a="1"><Value>part1
part2</Value></Root>
Во всех трех случаях алгоритмы канонизации, хеширования и подписи одинаковые: Код:<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:gostr34102001-gostr3411" />
<Reference URI="">
<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="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr3411" />
<DigestValue>fzJ2...g8I=</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>WcHL...Eg==</SignatureValue>
<KeyInfo>
<X509Data>
<X509Certificate>MIIJ...Bmk=</X509Certificate>
</X509Data>
</KeyInfo>
</Signature>
Канонизация исходного файла делается средствами .Net-а трансформацией System.Security.Cryptography.Xml.XmlDsigExcC14NTransform. Код:var xmlTransform = new XmlDsigExcC14NTransform();
xmlTransform.LoadInput(x);
var output = (MemoryStream) xmlTransform.GetOutput();
После трансформации получаем такие строки (декодированые из UTF-8) В первом случае: Код:<Root a="1" v="2"><Value>part1part2</Value></Root>
Во втором и третьем: Код:<Root a="1" v="2"><Value>part1
part2</Value></Root>
Во всех трех случаях трансформация соответствует стандарту и правилам канонизации xml-exc-c14n# основанной на XML-C14NОднако при проверке на КриптоПро DSS только первая подпись является математически корректной. Почему две другие не проходят математическую валидацию? Такое ощущение, что на стороне сервиса проверки происходит какая-то другая трансформация, которая иначе обрабатывает символ перевода каретки в текстовых узлах. Первый файл, чья подпись математически корректна: Код:<?xml version="1.0" encoding="utf-8"?><Root v="2" a="1"><Value>part1part2</Value><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:gostr34102001-gostr3411" /><Reference URI=""><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="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr3411" /><DigestValue>fzJ2YKJyg+HT7l9wyz/coc2Cg02A672DmHGL8lNlg8I=</DigestValue></Reference></SignedInfo><SignatureValue>WcHLnCl+8z9iWJSfYRe0TkjyttIPSvvxwroO+mCvCstluqJr8YQArvAcec6DqhwOorWscsOghgi9cWtcLvxiEg==</SignatureValue><KeyInfo><X509Data><X509Certificate>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</X509Certificate></X509Data></KeyInfo></Signature></Root>
Второй и третий, которые не проходят математику: Код:<?xml version="1.0" encoding="utf-8"?><Root v="2" a="1"><Value>part1
part2</Value><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:gostr34102001-gostr3411" /><Reference URI=""><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="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr3411" /><DigestValue>cxuyd7P51Wm1YstYM4EOoBXSWOMl+hOSewq0g+/hoZc=</DigestValue></Reference></SignedInfo><SignatureValue>cPU4B78LtoY+5HdmIxyaCxqxAWVcKzORZKLSjEEx/mwKNcAwoVwnBvv1DVg5khTELbKMRRsxTyNWIIzlsAOXSA==</SignatureValue><KeyInfo><X509Data><X509Certificate>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</X509Certificate></X509Data></KeyInfo></Signature></Root>
Код:<?xml version="1.0" encoding="utf-8"?><Root v="2" a="1"><Value>part1
part2</Value><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:gostr34102001-gostr3411" /><Reference URI=""><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="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr3411" /><DigestValue>cxuyd7P51Wm1YstYM4EOoBXSWOMl+hOSewq0g+/hoZc=</DigestValue></Reference></SignedInfo><SignatureValue>plZmM+wSeY0OcqSCI7gK+pyoNVGYRoi0MWhspWhFXyLXHTH0+5pRjCksxhtA0yhT1V7g0AsT9NcYMBKaVlKDWg==</SignatureValue><KeyInfo><X509Data><X509Certificate>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</X509Certificate></X509Data></KeyInfo></Signature></Root>
P.S. То, что они все не проходят по достоверности издателю корневого сертификата — это понятно и неинтересно — вопрос про математику.
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 31.07.2018(UTC) Сообщений: 9 Откуда: Екб Поблагодарили: 1 раз в 1 постах
|
Примеры файлов из предыдущего сообщения: Файл без перевода каретки plane.xml (5kb) загружен 3 раз(а). Подпись математически корректна. Файл с одним символом '\r' cr.xml (5kb) загружен 2 раз(а). Подпись не проходит математику. Файл с экранированным символом escapedCr.xml (5kb) загружен 2 раз(а). Подпись опять-таки не проходит математику.
|
|
|
|
Статус: Активный участник
Группы: Администраторы, Участники Зарегистрирован: 28.04.2010(UTC) Сообщений: 140 Откуда: Крипто-Про Поблагодарили: 15 раз в 14 постах
|
Добрый день,
На стороне сервера используются трансформы реализованные в .NET.
На вашей стороне средствами .NET (SignedXml) подписи проходят проверку?
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 31.07.2018(UTC) Сообщений: 9 Откуда: Екб Поблагодарили: 1 раз в 1 постах
|
Точно такое же поведение: Для файла без возврата каретки все норм, для файла с ней — не проходит. Что я делаю не так?
|
|
|
|
Статус: Активный участник
Группы: Администраторы, Участники Зарегистрирован: 28.04.2010(UTC) Сообщений: 140 Откуда: Крипто-Про Поблагодарили: 15 раз в 14 постах
|
Можно собственно увидеть полный код того, что выделаете?
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 31.07.2018(UTC) Сообщений: 9 Откуда: Екб Поблагодарили: 1 раз в 1 постах
|
Данные, которые будут подписаны формируем таким образом: Код:
public static SignedInfo GenerateSignedInfo(XmlDocument xml)
{
var xmlTransform = new XmlDsigExcC14NTransform();
xmlTransform.LoadInput(xml);
var canonXmlStream = (MemoryStream)xmlTransform.GetOutput();
var algorithm = HashAlgorithm.Create("GOST3411");
var digestValue = algorithm.ComputeHash(canonXmlStream);
var signedInfo = new SignedInfo
{
CanonicalizationMethod = SignedXml.XmlDsigExcC14NTransformUrl,
SignatureMethod = CPSignedXml.XmlDsigGost3410Url
};
var reference = new Reference(string.Empty)
{
DigestMethod = DigestMethod,
DigestValue = digestValue
};
reference.AddTransform(new XmlDsigEnvelopedSignatureTransform());
reference.AddTransform(new XmlDsigExcC14NTransform());
signedInfo.AddReference(reference);
return signedInfo;
}
Далее подписываем и формируем окончательно тэг Signature На самом деле я уже разобрался кто всю малину портит. В потрохах .Net есть код, который при проверке в методе SignedXml.CheckSignature() подменяет \r на \n, а \r\n на \n — они это называют нормализацией документа. На самом деле, просто прогоняет документ через XmlTextReader. Зачем? Я не понимаю. В итоге я формируя digestValue считаю хэш от просто канонизированного документа: <Root a="1" v="2"><Value>part1
part2</Value></Root>, а ребята из MS прежде чем канонизировать делают сначала нормализацию, которая убирает \r и пересчитывают хэш уже от <Root a="1" v="2"><Value>part1\npart2</Value></Root>. Естественно, математика слетает. Вот выдержки из исходников .Net: 1. Препроцессинг документа в методе подсчета хэш-кода: https://referencesource....phy/xml/reference.cs,3572. Нормализация в препроцессинге: https://referencesource....ography/xml/utils.cs,5083. Там дальше кодина TextReader и самые кишочки в методе чтения текстового узла ParseText: https://referencesource....mlTextReaderImpl.cs,5052
|
1 пользователь поблагодарил Степан З за этот пост.
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 22.10.2018(UTC) Сообщений: 2 Откуда: Самара
|
Автор: Степан З В потрохах .Net есть код, который при проверке в методе SignedXml.CheckSignature() подменяет \r на \n, а \r\n на \n — они это называют нормализацией документа. На самом деле, просто прогоняет документ через XmlTextReader.
А удалось решить эту проблему?
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 31.07.2018(UTC) Сообщений: 9 Откуда: Екб Поблагодарили: 1 раз в 1 постах
|
Автор: Владимир(theone) А удалось решить эту проблему? Нет, не представляю себе, как это можно решить на этапе проверки подписи. Ведь надо для этого переделать библиотеки MS и/или переписать код всех сторонних сервисов, проверяющих подпись. Но, понимая в чем суть проблемы, можно перед канонизацией делать точно такой же прогон документа через XmlReader, и только потом остальные преобразования. Соответственно, можно решить проблему «невалидной подписи» еще на этапе ее формирования.
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 22.10.2018(UTC) Сообщений: 2 Откуда: Самара
|
Автор: Степан З подменяет \r на \n, а \r\n на \n — они это называют нормализацией документа. Выдержка из стандарта канонизации XML: Line breaks normalized to #xA on input, before parsing Так что возможно ребята из MS все правильно делают. С другой стороны, почему точно такая же нормализация не произошла при подписании.
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 31.07.2018(UTC) Сообщений: 9 Откуда: Екб Поблагодарили: 1 раз в 1 постах
|
Автор: Владимир(theone) При этом дальше идут примеры, где они в innerText-е меняют \r на 
 и не меняют \n, а наоборот 
 меняют на \n! В атрибутах все спецсимволы меняют на последовательность &#..;. Дотнетовский класс трансформации System.Security.Cryptography.Xml.XmlDsigExcC14NTransform ведет себя именно так, как показано в примерах. Никаких преобразований line breaks to #xA на выходе нет. Но вроде и написано, что до парсинга документа это происходит, а не на выходе после канонизации. Фишка в том, что процессы нормализации и канонизации — это разные вещи. При формировании подписи я нормализацию не делал, делал только канонизацию, а при проверке классом SignedXml происходит еще и нормализация документа перед канонизацией.
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close