Статус: Новичок
Группы: Участники
Зарегистрирован: 06.08.2012(UTC) Сообщений: 4 Откуда: Moscow
|
Здравствуйте! Возникла следующая проблема При проверке подписи через .Net созданной через JCP возвращается отрицательный результат(подпись не валидна). При проверке подписи в JCP результат положительный(подпись валидна). Использовались пример из .NET SimpleCS(Xml.Verify) и слегка модифицированные примеры из JCP. Нашел в xml документе часть строки из-за которой происходит это расхождение(при подписании получаются разные значения DigestValue). Пример и классы во вложении.  attach.zip (5kb) загружен 9 раз(а).Можете подсказать в какой именно реализации ошибка, и что можно с этим сделать? Используемое ПО: КриптоПро CSP: 3.6.7777 КриптоПро .NET: 1.0.4812.0 КриптоПро JCP: 2.0.38481 Java: 1.7.0_67 Пакеты: serializer-2.9.1, xmlsec-1.5.2, xalan-2.7.1, org.apache.commons.logging;version="1.1.1"
|
|
|
|
|
|
Статус: Вам и не снилось
Группы: Администраторы
Зарегистрирован: 24.12.2007(UTC) Сообщений: 831 Откуда: Крипто-Про
Сказал(а) «Спасибо»: 1 раз Поблагодарили: 48 раз в 44 постах
|
В .NET выставлено свойство PreserveWhiteSpace = true? |
|
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 06.08.2012(UTC) Сообщений: 4 Откуда: Moscow
|
Да, естественно выставлен, код можно посмотреть в примерах по SDK .NET. Без символа перевода каретки /r( ) все работает нормально, и в .NET и в java подпись проверяется.
|
|
|
|
|
|
Статус: Вам и не снилось
Группы: Администраторы
Зарегистрирован: 24.12.2007(UTC) Сообщений: 831 Откуда: Крипто-Про
Сказал(а) «Спасибо»: 1 раз Поблагодарили: 48 раз в 44 постах
|
Соберите логи с .NET и Java при создании и проверке подписи. Для .NET добавьте в конфигурацию приложения: Код: <system.diagnostics>
<sources>
<source name="System.Security.Cryptography.Xml.SignedXml"
switchName="XmlDsigLogSwitch">
<listeners>
<add name="logFile" />
</listeners>
</source>
</sources>
<switches>
<add name="XmlDsigLogSwitch" value="Verbose" />
</switches>
<sharedListeners>
<add name="logFile"
type="System.Diagnostics.TextWriterTraceListener"
initializeData="c:\temp\NETXmlDsigLog.txt"/>
</sharedListeners>
<trace autoflush="true">
<listeners>
<add name="logFile" />
</listeners>
</trace>
</system.diagnostics>
Для Java см. инструкции здесь: http://www.mkyong.com/logging/log4j-log4j-properties-examples/. Надо, чтобы в логах отпечаталось канонизированное представление подписываемого узла, которое идёт на вход хэш-функции. И выложите логи сюда посмотреть. |
|
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 06.08.2012(UTC) Сообщений: 4 Откуда: Moscow
|
 SimpleCS.log.txt (7kb) загружен 10 раз(а). XMLDsig.log.txt (13kb) загружен 9 раз(а).Выложил. Собственно вопрос то где-ошибка скорее всего? и что можно сделать. Просто когда я пробовал подписывать на .net, для данных с \r и с \r\n получается одинаковый хэш. а когда пробовал получать отдельно результат канокализации, то байты были одинаковыми.
|
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 25.09.2015(UTC) Сообщений: 1
|
Столкнулся с той же проблемой. Причины было две: 1)В XmlDsigExcC14NTransform как-то странно реализован метод GetDigestedOutput используемый при вычислении хеша от SignedInfo. Я этот метод переопределил на следующий: Код:
public class CustomXmlDsigExcC14NTransform : XmlDsigExcC14NTransform
{
public override byte[] GetDigestedOutput(HashAlgorithm hash)
{
using (var s = new BinaryReader((Stream)this.GetOutput()))
{
var xmlBytes = s.ReadBytes((int) s.BaseStream.Length);
var xmlString = Encoding.UTF8.GetString(xmlBytes);
xmlBytes = Encoding.UTF8.GetBytes(xmlString);
hash.ComputeHash(xmlBytes);
return hash.Hash;
}
}
}
2) Криптопро JSP использует SignatureValue реверсивном порядке. Пришлось и мне делать реверс. см. http://www.cryptopro.ru/....aspx?g=posts&m=2338(Кто-нибудь может объяснить зачем они это делают?  )
|
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 06.08.2012(UTC) Сообщений: 4 Откуда: Moscow
|
Причина точно не в этом, потому что уже в DigestValue другое значение, а оно рассчитывается до выполнения GetDigestedOutput. Разница возникает перед тем как производятся трансформации в SignedXml. Собственно перед трансформациями делается вызов следующего метода из класса System.Security.Cryptography.Xml.Utils Код:
internal static XmlDocument PreProcessDocumentInput(XmlDocument document, XmlResolver xmlResolver, string baseUri)
{
if (document == null)
{
throw new ArgumentNullException("document");
}
MyXmlDocument document2 = new MyXmlDocument {
PreserveWhitespace = document.PreserveWhitespace
};
using (TextReader reader = new StringReader(document.OuterXml))
{
XmlReaderSettings settings = new XmlReaderSettings {
XmlResolver = xmlResolver,
DtdProcessing = DtdProcessing.Parse
};
XmlReader reader2 = XmlReader.Create(reader, settings, baseUri);
document2.Load(reader2);
}
return document2;
}
После этого в документе символ \r заменяется на \n Это ошибка C#? И не понятно как это обойти.
|
|
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close