Статус: Участник
Группы: Участники
Зарегистрирован: 30.10.2012(UTC) Сообщений: 22 Откуда: Moscow
Сказал(а) «Спасибо»: 2 раз Поблагодарили: 1 раз в 1 постах
|
Добрый день. Возникла проблема при подписи xml средствами ЭЦП Browser plug-in (асинхронные методы). Подпись проходит валидацию на стороне клиента (JavaScript), но падает при проверке на сервере (C#). Пробовал подписать xml на C# - всё работает. При этом DigestValue рассчитанная на JS и C# совпадают. Crypto Pro CSP - 3.9.8353 CryptoPro .NET - 1.0.5821 ЭЦП Browser plug-in JSModuleVersion - 2.0.2 Браузер Chrome - 52.0.2743.116 Примеры кода на JS (ECMA 2015): Код:
function createXmlSignature(certificate, dataToSign) {
return cadesplugin.CreateObjectAsync('CAdESCOM.CPSigner')
.then(signer => signer.propset_Certificate(certificate)
.then(() => signer))
.then(signer => cadesplugin.CreateObjectAsync('CAdESCOM.SignedXML')
.then(signedXml => {
signedXml.propset_Content(dataToSign)
return signedXml
})
.then(signedXml => {
signedXml.propset_SignatureType(cadesplugin.CADESCOM_XML_SIGNATURE_TYPE_ENVELOPED)
return signedXml
})
.then(signedXml => {
signedXml.propset_SignatureMethod(cadesplugin.XmlDsigGost3410UrlObsolete)
return signedXml
})
.then(signedXml => {
signedXml.propset_DigestMethod(cadesplugin.XmlDsigGost3411UrlObsolete)
return signedXml
})
.then(signedXml => signedXml.Sign(signer))
)
}
Проверка подписи на C# Код:
public bool VerifyXmlSignature(XmlDocument document, XmlElement signature)
{
try
{
if (document == null)
throw new ArgumentException("Не передан документ", nameof(document));
if (signature == null)
throw new ArgumentException("Не передана подпись", nameof(signature));
var signedXml = new SignedXml(document);
signedXml.LoadXml(signature);
return signedXml.CheckSignature();
}
catch (CryptographicException)
{
return false;
}
}
Исходная xml: Код:
<?xml version="1.0" encoding="UTF-8"?>
<Envelope xmlns="urn:envelope">
<Data>Hello, World!</Data>
<Node xml:id="nodeID">Hello, Node!</Node>
</Envelope>
Во вложении 3 подписанные xml: клиентом (XmlDsigGost3411Url и XmlDsigGost3411UrlObsolete) и сервером на C#  client.xml (4kb) загружен 4 раз(а). client_old.xml (4kb) загружен 1 раз(а). server.xml (4kb) загружен 4 раз(а).UPD:Кстати, если исходную xml оставить как в примере на cpdn.crypto.ru, то digestvalue не совпадают. Есть предположение, что виновата каноникализация. Исходная xml Код:"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<Envelope xmlns=\"urn:envelope\">\n" +
" <Data>\n" +
" Hello, World!\n" +
" </Data>\n" +
" <Node xml:id=\"nodeID\">\n" +
" Hello, Node!\n" +
" </Node>\n" +
" \n" +
"</Envelope>"
Подписанная клиентом  client_with_wrap.xml (4kb) загружен 2 раз(а).UPD2:Если подписать xml на демостранице, то эта подпись при проверке на сервере C# невалидна! Отредактировано пользователем 31 августа 2016 г. 15:29:10(UTC)
| Причина: Не указана
|
|
|
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 24.11.2009(UTC) Сообщений: 965 Откуда: Crypto-Pro
Сказал(а) «Спасибо»: 3 раз Поблагодарили: 174 раз в 152 постах
|
А вы выставляете у XMLDocument свойство PreserveWhitespace? Он по умолчанию убивает все пробелы. |
|
 1 пользователь поблагодарил Анатолий Беляев за этот пост.
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 30.10.2012(UTC) Сообщений: 22 Откуда: Moscow
Сказал(а) «Спасибо»: 2 раз Поблагодарили: 1 раз в 1 постах
|
Автор: cross  А вы выставляете у XMLDocument свойство PreserveWhitespace? Он по умолчанию убивает все пробелы. И правда дело было в этом. var xmlDoc = new XmlDocument {PreserveWhitespace = true}; - помог
|
|
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close