Ключевое слово в защите информации
ключевое слово
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline stdevol  
#1 Оставлено : 31 августа 2016 г. 13:29:02(UTC)
stdevol

Статус: Участник

Группы: Участники
Зарегистрирован: 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)  | Причина: Не указана

Offline cross  
#2 Оставлено : 31 августа 2016 г. 16:02:23(UTC)
Анатолий Беляев

Статус: Сотрудник

Группы: Администраторы, Участники
Зарегистрирован: 24.11.2009(UTC)
Сообщений: 965
Откуда: Crypto-Pro

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 174 раз в 152 постах
А вы выставляете у XMLDocument свойство PreserveWhitespace? Он по умолчанию убивает все пробелы.
Техническую поддержку оказываем тут.
Наша база знаний.
Наша страничка в Instagram.
thanks 1 пользователь поблагодарил Анатолий Беляев за этот пост.
stdevol оставлено 31.08.2016(UTC)
Offline stdevol  
#3 Оставлено : 31 августа 2016 г. 17:31:03(UTC)
stdevol

Статус: Участник

Группы: Участники
Зарегистрирован: 30.10.2012(UTC)
Сообщений: 22
Откуда: Moscow

Сказал(а) «Спасибо»: 2 раз
Поблагодарили: 1 раз в 1 постах
Автор: cross Перейти к цитате
А вы выставляете у XMLDocument свойство PreserveWhitespace? Он по умолчанию убивает все пробелы.


И правда дело было в этом.

var xmlDoc = new XmlDocument {PreserveWhitespace = true}; - помог
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.