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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Alexander Bocharov  
#1 Оставлено : 12 декабря 2018 г. 0:43:25(UTC)
Alexander Bocharov

Статус: Новичок

Группы: Участники
Зарегистрирован: 12.12.2018(UTC)
Сообщений: 3
Российская Федерация

Добрый день!

Формирую подпись (XMLDSig) для XML-документа по ГОСТ 34.11-2012-256 (КриптоПро CSP 5, КриптоПро .NET).

На выходе получаю:

Код:

<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>


Проверку подпись проходит.

Но проблема в том, что приходится взаимодействовать с системой, где для пространства имен xmlns="http://www.w3.org/2000/09/xmldsig#" используется префикс ds (КриптоПро JСP).

Их подпись имеет вид:

Код:

<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>


При проверке их подписи при вызове
Код:
signedXml.CheckSignature(certificate, true)


вылетает исключение на неподдерживаемую трансфрмацию.

Соответственно моя подпись без префикса ds в системе где он используется не проходит проверку.


Как мне заставить SignedXml подписывать документ с префиксом ds и проверять такие подписи?
Offline two_oceans  
#2 Оставлено : 12 декабря 2018 г. 12:47:16(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 395 раз в 366 постах
Добрый день!
Собственно отсутствие префикса (пространство имен по умолчанию) предусмотрено как один из вариантов в стандарте xmldsig и не должно быть никаких проблем с проверкой при его использовании. Посмотрите http://www.cryptopro.ru/...ts&m=97936#post97936 там похоже на подобный вопрос с пространством имен по умолчанию. Вкратце: сериализация работала неправильно при последовательном создании узлов для разных пространств, которые без префикса, для каждого такого узла прописали атрибут [XmlRoot].

Из описания вопроса и примеров остается много неясного в плане какая именно Вам нужна подпись - в обоих примерах для Reference не указано ни одного трансформа вообще. Указанный CanonicalizationMethod применяется только к Signedinfo перед вычислением подписи и никак не влияет на вычисление хэша в reference. Reference URI у Вас указан пустой, то есть подписывается весь документ и подпись включается внутрь документа, а в таком случае для подстраховки не помешал бы enveloped signature трансформ в reference. В контрольном примере второй системы Reference URI вообще отсутствует и вероятно именно это приводит к ошибке, так как неизвестно вообще от чего считается хэш.
Offline Alexander Bocharov  
#3 Оставлено : 12 декабря 2018 г. 21:07:54(UTC)
Alexander Bocharov

Статус: Новичок

Группы: Участники
Зарегистрирован: 12.12.2018(UTC)
Сообщений: 3
Российская Федерация

Конкретный вариант

Код:

public Task<string> SignXmlFileAsync(string xmlToBase64, X509Certificate2 certificate)
        {
            if (certificate == null)
            {
                throw new ArgumentNullException(nameof(certificate));
            }

            var signToBase64 = "";

            using (var ms = new MemoryStream(Convert.FromBase64String(xmlToBase64)))
            using (var stream = new StreamReader(ms, Encoding.UTF8))
            using (var xmlTextReader = new XmlTextReader(stream))
            {
                var xmlDocument = new XmlDocument { PreserveWhitespace = true };
                xmlDocument.Load(xmlTextReader);

                var signedXml = new SignedXml(xmlDocument) { SigningKey = certificate.PrivateKey };

                var reference = new Reference
                {
                    Uri = "",
                    DigestMethod = CPSignedXml.XmlDsigGost3411_2012_256Url
                };
                signedXml.AddReference(reference);

                signedXml.SignedInfo.CanonicalizationMethod = SignedXml.XmlDsigExcC14NTransformUrl;

                var keyInfo = new KeyInfo();
                keyInfo.AddClause(new KeyInfoX509Data(certificate));

                signedXml.KeyInfo = keyInfo;

                signedXml.ComputeSignature();

                var xmlDigitalSignature = signedXml.GetXml();
                signToBase64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(xmlDigitalSignature.OuterXml));
            }

            return Task.FromResult(signToBase64);
        }
Offline Alexander Bocharov  
#4 Оставлено : 12 декабря 2018 г. 21:14:16(UTC)
Alexander Bocharov

Статус: Новичок

Группы: Участники
Зарегистрирован: 12.12.2018(UTC)
Сообщений: 3
Российская Федерация

Автор: two_oceans Перейти к цитате
Добрый день!
Из описания вопроса и примеров остается много неясного в плане какая именно Вам нужна подпись - в обоих примерах для Reference не указано ни одного трансформа вообще. Указанный CanonicalizationMethod применяется только к Signedinfo перед вычислением подписи и никак не влияет на вычисление хэша в reference. Reference URI у Вас указан пустой, то есть подписывается весь документ и подпись включается внутрь документа, а в таком случае для подстраховки не помешал бы enveloped signature трансформ в reference. В контрольном примере второй системы Reference URI вообще отсутствует и вероятно именно это приводит к ошибке, так как неизвестно вообще от чего считается хэш.


Подпись не внедряется в документ, это отдельный документ. Reference URI и все остальное взято исходя из того, чтобы вид подписи с системой партнеров совпадал полностью. Этого добились. Только проблема в том, что когда партнеры у себя убрали префикс, подписи у нас стали проверяться. Если они префикс не убирают, а у нас он отсутствует, то документ изменен выдает. А у нас вообще с префиксом ds на КриптоПро .NET валится разбор. Поэтому префикс влияет.

Offline two_oceans  
#5 Оставлено : 13 декабря 2018 г. 11:37:49(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 395 раз в 366 постах
Впечатление такое, что 2 системы не совпали по "кривизне". То есть сформированный документ еще как-то обрабатывается после подписания и эти обработки разные. Как я понимаю, для проверки с пустым URI как раз симулируется разъединение внедренной подписи.

Полагаю, подпись в отдельном файле - отдельный xml документ и должна включать как минимум заголовок xml, иначе по коду выходит что получили нормальный документ и специально выкинули заголовок и передаете оставшийся обрывок как подпись. Возможно именно из-за отсутствия заголовка пространства имен обрабатываются некорректно.
Соответственно попробуйте добавить выкинутый заголовок, вдруг у Вас проверка заработает с префиксом?
Код:
<?xml version="1.0" encoding="UTF-8"?>

Отредактировано пользователем 13 декабря 2018 г. 11:43:41(UTC)  | Причина: Не указана

RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.