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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline itturism  
#1 Оставлено : 5 апреля 2021 г. 22:46:03(UTC)
itturism

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

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

Здравствуйте уважаемые разработчики. Возникла проблема с подписанием и никак не решить её уже несколько дней.
Для интеграции с банком Альфа банк требуется подписать документ ГОСТ Р 34.10-2012 по стандарту XMLDSig

Вот код который подписывает документ
AsymmetricAlgorithm key = Certificate.PrivateKey;
SignedXml signedXml = new SignedXml(xmlDoc);
signedXml.SigningKey = key;
Reference reference = new Reference();
reference.Uri = "";
//reference.DigestMethod = CPSignedXml.XmlDsigGost3411Url;
signedXml.SignedInfo.SignatureMethod = CPSignedXml.XmlDsigGost3410UrlObsolete;
XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
reference.AddTransform(env);

XmlDsigExcC14NTransform c14 = new XmlDsigExcC14NTransform();
reference.AddTransform(c14);
signedXml.AddReference(reference);

KeyInfo keyInfo = new KeyInfo();
keyInfo.AddClause(new KeyInfoX509Data(Certificate));
signedXml.KeyInfo = keyInfo;

signedXml.ComputeSignature();
return signedXml.GetXml();


Но я постоянно 2021-04-05_22-24-11.png (11kb) загружен 13 раз(а). ловлю ексепшен Parameter must support GOST R 34.10-2001 algorithm

Сертификат которым я подписываю выпущен и поддерживает:
Signature Algoritm GOST R 34.11/34.10-2001
Signature hash algoritm GOST R 34.11-94

Я пробовал манипулировать вот этими строками
//reference.DigestMethod = CPSignedXml.XmlDsigGost3411UrlObsolete;
signedXml.SignedInfo.SignatureMethod = CPSignedXml.XmlDsigGost3410UrlObsolete;
Но постоянно получаю на выходе либо ексепшн как я писал, либо
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256"/>
Хотя я явно не устанавливал эти алгоритмы. Подскажите пожалуйста, что я делаю не так
Версии CryptoPro.Sharpei.Xml v4.0.30319
CryptoPro.Sharpei.Base.dll v4.0.30319
Win Server 2019 Standart
На сервер так же стоит CryptoPro CSP 5.0.11455 KC1
Серийный номер 4040000000ГЛФС800ЗКГ
Тип лицензии серверная
Срок действия постоянная

Отмечу, что сертификат 512 2021-04-05_23-05-16.png (12kb) загружен 6 раз(а).

2021-04-05_22-24-11.png (11kb) загружен 13 раз(а).

Отредактировано пользователем 5 апреля 2021 г. 23:05:48(UTC)  | Причина: Не указана

Offline Андрей *  
#2 Оставлено : 6 апреля 2021 г. 0:45:20(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 10,563
Мужчина
Российская Федерация

Сказал «Спасибо»: 388 раз
Поблагодарили: 1586 раз в 1221 постах
Здравствуйте.

Получите тестовый сертификат с ГОСТ-2012.
Используйте алгоритмы с 2012, 256 бит.

В документации:

Константы


Свойство ISignedXML::DigestMethod



Свойство ISignedXML::SignatureMethod
Техническую поддержку оказываем тут
Наша база знаний
Offline itturism  
#3 Оставлено : 6 апреля 2021 г. 0:59:03(UTC)
itturism

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

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

Спасибо за быстрый ответ. Дело в том что по документации банка я должен сгенерировать сертификат как показано у них на сладйе.
Прилагаю слайд. Я так и сделал.
Подскажите пожалуйста. Если к примеру сертификат я сделал ка положено то для него другие константы или мне стоит переделать сертификат под параметры которые вы рекомендуете 2021-04-06_00-54-25.png (282kb) загружен 3 раз(а). в ответе?


Если четно извините, но я не понял ответа. Я сертификат сгенерировал с параметрами ключа CSP GOST 34.10.-2012, алгоритм хеширования 256 бит.
Константы из списка не понял как и где использовать. к сожалению. Ошибка которую я получаю о чем говорит? что я неверные параметры задал

reference.DigestMethod = CPSignedXml.XmlDsigGost3411UrlObsolete;
signedXml.SignedInfo.SignatureMethod = CPSignedXml.XmlDsigGost3410UrlObsolete;

или использую сертификат не пож эти константы. В доке Альф-абанка есть пример подписи готовой, оттуда я выверил названия этих констант.

Вот как выглядит это у них

<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/0...#gostr34102001-gostr3411"/>
<ds:Reference URI="">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411"/>
<ds:DigestValue>ALQVhJd+YufeR5ebo1dFcv5Fdv0eqSSNWfEOm2soDrU=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>

Вот я подобрал к примеру параметры при которых ошибки нет, подпоясывание проходит
reference.DigestMethod = CPSignedXml.XmlDsigGost3411_2012_256Url;
signedXml.SignedInfo.SignatureMethod = CPSignedXml.XmlDsigGost3410_2012_256Url;
Но банк возвращает что подпись не валдина, хотя я им отправил открытую часть своего ключа.
Ощущение такое что какая то путаница в алогоритмах и в их документации. не могу понять. Банк то же не может толком ответить, запросили сам файл который я отправляю с запросом для проверки, но не верен что у них что то из этого выйдет. Дело в том что подобранными мною параметрами заголовки наших секций отличаются. Разные алгоритмы.

Отредактировано пользователем 6 апреля 2021 г. 1:37:17(UTC)  | Причина: Не указана

Offline two_oceans  
#4 Оставлено : 6 апреля 2021 г. 8:27:53(UTC)
two_oceans

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

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

Сказал(а) «Спасибо»: 90 раз
Поблагодарили: 312 раз в 294 постах
Добрый день.
Цитата:
Сертификат которым я подписываю выпущен и поддерживает:
Signature Algoritm GOST R 34.11/34.10-2001
Signature hash algoritm GOST R 34.11-94
Эти строки показывают алгоритм ключа УЦ, если смените УЦ на "свежий", будет другой алгоритм. Более корректно смотреть строку алгоритма открытого ключа.
Цитата:
Подскажите пожалуйста, что я делаю не так
Выделенное в примере банка это алгоритмы использовавшиеся в схеме подписания ГОСТ-2001 (подписание гост-2001 и хэш гост-94). Возможно банк просто не обновил пример.

Цитата:
reference.DigestMethod = CPSignedXml.XmlDsigGost3411_2012_256Url;
signedXml.SignedInfo.SignatureMethod = CPSignedXml.XmlDsigGost3410_2012_256Url;
Это как раз корректный алгоритм SignatureMethod для подписи гост-2012. Если не задаете явно, то вероятно автоматически выбран по алгоритму ключа (открытого ключа в сертификате или закрытого ключа). Попробуйте сначала разобраться с signedXml.SignedInfo.CanonicalizationMethod при таких константах. Его нужно задать явно - аналогично тому как делали для трансформа c14n. В примере Exclusive вариант c14n, а автоматом выбрался Inclusive вариант c14n.

P.S. При выборе констант "без 2012" Вы получаете исключение, потому что ключ у Вас гост-2012, а SignatureMethod указан гост-2001. SignatureMethod должен быть согласован с алгоритмом ключа.
На актуальной версии КриптоПро Гост-2001 запрещен к генерации ключа и использованию ключа для подписи (то есть если "сильно надо", например, для проверки, то КриптоПро 3.6 сможет им подписать, но эта версия почти наверняка несовместима с 2019 сервером, пробуйте на Семерке).



Offline itturism  
#5 Оставлено : 6 апреля 2021 г. 11:23:39(UTC)
itturism

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

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

Спасибо. Подробненько.

CanonicalizationMethod сделал как в примере. в итоге вот такой набор не дает ошибок подписи, но банк всё равно отвергает подпись.
reference.DigestMethod = CPSignedXml.XmlDsigGost3411_2012_256Url;
signedXml.SignedInfo.SignatureMethod = CPSignedXml.XmlDsigGost3410_2012_256Url;
signedXml.SignedInfo.CanonicalizationMethod= SignedXml.XmlDsigExcC14NTransformUrl;

Уже не знаю что и попробовать.
Offline itturism  
#6 Оставлено : 6 апреля 2021 г. 11:37:00(UTC)
itturism

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

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

Можно у вас тогда спросить вот что.
Я при генерации сертификата явно задаю алогритм 2012, получаю файл cer. Затем я этот файл переношу на компьютер где нет крипто про и когда открываю сертификат вижу Алгоритм 1.2.643.2.2.3
В документации сказано что это szOID_CP_GOST_R3411_R3410EL "1.2.643.2.2.3" Алгоритм цифровой подписи ГОСТ Р 34.10-2001

2021-04-06_11-33-49.png (37kb) загружен 6 раз(а).

Тогда почему не работает подписание как в примере банка? 2001
Offline Андрей *  
#7 Оставлено : 6 апреля 2021 г. 11:41:13(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 10,563
Мужчина
Российская Федерация

Сказал «Спасибо»: 388 раз
Поблагодарили: 1586 раз в 1221 постах
Автор: itturism Перейти к цитате
Можно у вас тогда спросить вот что.
Я при генерации сертификата явно задаю алогритм 2012, получаю файл cer. Затем я этот файл переношу на компьютер где нет крипто про и когда открываю сертификат вижу Алгоритм 1.2.643.2.2.3
В документации сказано что это szOID_CP_GOST_R3411_R3410EL "1.2.643.2.2.3" Алгоритм цифровой подписи ГОСТ Р 34.10-2001

2021-04-06_11-33-49.png (37kb) загружен 6 раз(а).

Тогда почему не работает подписание как в примере банка? 2001


потому что запрашиваете в УЦ с 2001 и смотрите на его алгоритм?
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#8 Оставлено : 6 апреля 2021 г. 11:42:06(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 10,563
Мужчина
Российская Федерация

Сказал «Спасибо»: 388 раз
Поблагодарили: 1586 раз в 1221 постах
Техническую поддержку оказываем тут
Наша база знаний
Offline itturism  
#9 Оставлено : 6 апреля 2021 г. 11:47:21(UTC)
itturism

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

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

Я запрашиваю так как на слайде по адресу https://www.cryptopro.ru/certsrv/certrqma.asp . и смотрю потом в свойствах полученного сертификата test_sletat.rar (1kb) загружен 1 раз(а).
Offline Андрей *  
#10 Оставлено : 6 апреля 2021 г. 12:02:05(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 10,563
Мужчина
Российская Федерация

Сказал «Спасибо»: 388 раз
Поблагодарили: 1586 раз в 1221 постах
Автор: itturism Перейти к цитате
Я запрашиваю так как на слайде по адресу https://www.cryptopro.ru/certsrv/certrqma.asp . и смотрю потом в свойствах полученного сертификата test_sletat.rar (1kb) загружен 1 раз(а).


1. Старая инструкция. Вы обращаетесь к УЦ с ГОСТ-2001, получаете личный сертификат с 2012, но смотрите в разделе алгоритм УЦ, а не свой.
2. Используйте УЦ с ГОСТ 2012, ссылка выше.

3. Уточните у альфа банка, они до сих пор используют 2001 ГОСТ или перешли на 2012?
Техническую поддержку оказываем тут
Наша база знаний
Offline itturism  
#11 Оставлено : 6 апреля 2021 г. 13:57:37(UTC)
itturism

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

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

Я на сервере по ссылке, которую вы приводите, не могу установить выпущенный сертификат. Пишет ошибку:

Запрошенный вами сертификат был вам выдан.

Установить этот сертификат
Данный ЦС не является доверенным. Чтобы доверять сертификатам, выданным этим центром сертификации, установите этот сертификат ЦС

Выпуск


Я устанавливаю предлагаемый сертификат для решения конфликта, и он появляется в реестре сертификатов в разделе Personal, но установка полученного сертификата из браузера проходит с той же ошибкой Данный ЦС не является доверенным. Несколько попыток повторить действия приводят к тем же результатам.
Offline Андрей *  
#12 Оставлено : 6 апреля 2021 г. 14:01:22(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 10,563
Мужчина
Российская Федерация

Сказал «Спасибо»: 388 раз
Поблагодарили: 1586 раз в 1221 постах
Что мешает установить сертификат УЦ в правильное хранилище - доверенные корневые? Root.
Техническую поддержку оказываем тут
Наша база знаний
Offline itturism  
#13 Оставлено : 6 апреля 2021 г. 15:15:04(UTC)
itturism

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

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

Спасибо за помощь. Проблема решена. Ошибка заключалась в том что передавался не весь xml а только то что было в XMLDocumetnt.OuterXML или даже InnerXmlю Не важно что, но это было не несколько байт меньше нежели сохранить XMLDocument в файл, а потом прочитать массив byte[] из этого файла.

Вот полный метод подписания, который работает, может кому пригодится
private static void Sign()
{
try
{
Document doc = new Document();
//Создание документа , заполнение
CreateDocumentRequest(doc);
var serializer = new XmlSerializer(typeof(Document));
XmlDocument xDoc = new XmlDocument();
xDoc.PreserveWhitespace = true;
using (var stream = new MemoryStream())
{
serializer.Serialize(stream, doc);
stream.Position = 0;
xDoc.Load(stream);
}
if (xDoc.FirstChild.NodeType == XmlNodeType.XmlDeclaration)
((XmlDeclaration)xDoc.FirstChild).Encoding = Encoding.UTF8.HeaderName;
X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly);
X509Certificate2Collection found = store.Certificates.Find(X509FindType.FindBySubjectName,
SERT_NAME, false);
X509Certificate2 Certificate = found[0];
XmlElement sign = SignXml(Certificate, xDoc);
//Добавляем подписанную секцию в документ
xDoc.DocumentElement.GetElementsByTagName("SgntrSt")[0].AppendChild(xDoc.ImportNode(sign, true));
var file = Path.GetTempFileName();
xDoc.Save(file);
ASCIIEncoding encoding = new ASCIIEncoding();

byte[] byte1 = File.ReadAllBytes(file);

Ver(true, file);
HttpWebRequest webRequest = (HttpWebRequest)HttpWebRequest.Create("https://grampus-int.alfabank.ru/API/v1/ISO20022/Statements");
webRequest.Method = "POST";
webRequest.ContentType = "application/xml";
webRequest.Accept = "*/*";
webRequest.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
webRequest.Headers["Authorization"] = "Basic " + Convert.ToBase64String(Encoding.Default.GetBytes("643223:123456"));
webRequest.ContentLength = byte1.Length;
webRequest.ClientCertificates.Add(Certificate);
Console.WriteLine($"{webRequest.RequestUri}");
ServicePointManager.ServerCertificateValidationCallback = (a, b, c, d) => true;
Stream bodyStream = webRequest.GetRequestStream();
bodyStream.Write(byte1, 0, byte1.Length);
foreach (var v in webRequest.Headers)
{
var vv = webRequest.Headers[v.ToString()];
Console.WriteLine($"{ v}: {vv}");
}
Console.WriteLine($"{xDoc.OuterXml}");
HttpWebResponse myHttpWebResponse = (HttpWebResponse)webRequest.GetResponse();
StreamReader myStreamReader = new StreamReader(myHttpWebResponse.GetResponseStream(),
Encoding.GetEncoding(1251));
var result = myStreamReader.ReadToEnd();
}
catch (WebException ex)
{
using (var stream = ex.Response.GetResponseStream())
using (var reader = new StreamReader(stream))
{
Console.WriteLine($"Error: {reader.ReadToEnd()}");
Console.ReadKey();
}
}
catch (Exception ex)
{
throw ex;
}
}
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.