Статус: Новичок
Группы: Участники
Зарегистрирован: 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 и проверять такие подписи?
|
|
|
|
Статус: Эксперт
Группы: Участники
Зарегистрирован: 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 вообще отсутствует и вероятно именно это приводит к ошибке, так как неизвестно вообще от чего считается хэш.
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 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);
}
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 12.12.2018(UTC) Сообщений: 3
|
Автор: two_oceans Добрый день! Из описания вопроса и примеров остается много неясного в плане какая именно Вам нужна подпись - в обоих примерах для Reference не указано ни одного трансформа вообще. Указанный CanonicalizationMethod применяется только к Signedinfo перед вычислением подписи и никак не влияет на вычисление хэша в reference. Reference URI у Вас указан пустой, то есть подписывается весь документ и подпись включается внутрь документа, а в таком случае для подстраховки не помешал бы enveloped signature трансформ в reference. В контрольном примере второй системы Reference URI вообще отсутствует и вероятно именно это приводит к ошибке, так как неизвестно вообще от чего считается хэш. Подпись не внедряется в документ, это отдельный документ. Reference URI и все остальное взято исходя из того, чтобы вид подписи с системой партнеров совпадал полностью. Этого добились. Только проблема в том, что когда партнеры у себя убрали префикс, подписи у нас стали проверяться. Если они префикс не убирают, а у нас он отсутствует, то документ изменен выдает. А у нас вообще с префиксом ds на КриптоПро .NET валится разбор. Поэтому префикс влияет.
|
|
|
|
Статус: Эксперт
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close