1 (2017-09-24 15:55:24 отредактировано ruslang)

Тема: Сигнатура + C# для УФЭБС

Здравствуйте. Мне для подписания xml по формату УФЭБС нужно использовать два сертификата. Один для формирования ЗК и один для формирования КА. Из ЦБ получил sdk для .Net. В документации к SDK не могу найти как указать каким сертификатом нужно подписывать объект в памяти. В КриптоПро можно было по серийному номеру получить сертификат из хранилища и передать его для подписи. Как это сделать через Сигнатуру? Желательно как можно подробнее описать. Спасибо.

2 (2017-09-26 13:21:13 отредактировано Saches)

Re: Сигнатура + C# для УФЭБС

Насколько я понимаю, на форуме Bankir.ru Вам уже ответили. И, т.к. разработчиком УФЭБС и АРМ КБР  является ЦБ РФ, вопросы на эти темы задавать лучше им или на упомянутом форуме.

3

Re: Сигнатура + C# для УФЭБС

Я написал сюда, как разработчикам сигнатуры, чтобы получить ответ, как с помощью sdk для C# при инициализации контекста указывать каким сертификатом или каким ключом подписывать. Я понимаю, что разработчики тут не относятся к АРМ КБР и фрматам УФЭБСа, но у меня вопрос по их СКЗИ. Вот, что у меня имеется:

VcertObject _ctx = new VcertObject();
_ctx.Initialize(VcertObject.CryptMy, VcertObject.InitializeFlags.InitCheckExpired);

...

foreach(var payment in payments)
{
   string originalXml = payment.OuterXml;
   var signParam = new SignParameters { Pkcs7 = true, Detached = true };
   var sign = _ctx.SignMemory(signParam, Encoding.GetEncoding(1251).GetBytes(originalXml), null);
   elem.InnerText = Convert.ToBase64String(sign);
   payment.InsertBefore(elem, payment.FirstChild);
}
payment типа XmlNode - это ED.

Мне нужно подписывать программно, а не через их утилиту.

4 (2017-09-28 11:11:30 отредактировано Saches)

Re: Сигнатура + C# для УФЭБС

Есть такое ощущение, что Вы спрашиваете что-то не то или не так. Поэтому и не понятно, как Вам отвечать.
Давайте по порядку, в общем случае Вам нужно:
1. Сформировать ЗК(ЭП)  для каждого ED (XML файла). Для формирования ЭП нужно использовать закрытый ключ из сертификата с неким определенным OID-ом.
2. Далее, нужно сформировать "Служебный конверт" их этих ED и подписать его. Причем, для формирования т.н. КА должен уже использоваться другой сертификат (с другим OID-ом).

О том, каким сертификатом что подписывать (по OID-ам) изложено здесь - http://www.cbr.ru/mcirabis/acyoc/Inf_Mci_82(2017).pdf
При большом желании, для целей тестирования, можно пользоваться каким либо одним сертификатом.

Если же у Вас вопрос по названиям и использованию вызовов, так укажите конкретно, что неясно.
Или что-то непонятно в документации на Сигнатуру -  http://www.cbr.ru/mcirabis/PO/skad_ver5.332.0.zip ?

5

Re: Сигнатура + C# для УФЭБС

Не понятно,  как программно указать, что для подписи ЗК нужно взять сертификат с ключом имеющим OID 1.3.6.1.4.1.3670.5.10.15, а для формирования КА нужно взять другой сертификат с private ключом имеющим OID 1.3.6.1.4.1.3670.5.10.16. При вызове фнц SignMemory из СКЗИ Сигнатура, я не могу передать в нее как параметр сертификат, каким нужно подписать. У меня была идея, что нужно создать два профиля и инициализировать два контекста указывая имена этих профилей. для ЗК свой профиль, для КА свой профиль. Но в таком варианте при попытке инициализации контекста sdk для C# отваливается и не выдает никакой ошибки. Изучив документацию по sdk C#
я не смог найти ответа на свой вопрос.

Еще, вопрос в тему УФЭБС хочу спросить, как у осведомленного человека. Везде в примерах УФЭБСа в декларации xml указывается кодировка windows-1251. А при применении правил нормализации и канонизации указывается кодировка utf-8 без BOM. Кому верить? Может вы подскажите, где и какая кодировка должна быть в итоге? Правила нормализации и канонизации вы сами реализовывали или нашли где то готовый вариант? При работе со СМЭВ я использовал SignedXml и в параметрах указывал по каким правилам(ГОСТам) канонизировать и нормализовать xml. Но тут так не получится.

6

Re: Сигнатура + C# для УФЭБС

Подпись выполняется рабочим сертификатом базы, на которой была выполнена инициализация.
Действительно, нужно создать два профиля и инициализировать два контекста. Пример инициализации профиля:

VcertObject vcertCtx = new VcertObject();
vcertCtx.Initialize("ProfileName", VcertObject.InitializeFlags.UseRegistry);

7 (2017-09-27 18:06:42 отредактировано Saches)

Re: Сигнатура + C# для УФЭБС

ruslang пишет:

..........Еще, вопрос в тему УФЭБС хочу спросить, как у осведомленного человека. Везде в примерах УФЭБСа в декларации xml указывается кодировка windows-1251. А при применении правил нормализации и канонизации указывается кодировка utf-8 без BOM. Кому верить? Может вы подскажите, где и какая кодировка должна быть в итоге? Правила нормализации и канонизации вы сами реализовывали или нашли где то готовый вариант? При работе со СМЭВ я использовал SignedXml и в параметрах указывал по каким правилам(ГОСТам) канонизировать и нормализовать xml. Но тут так не получится.

Как уже говорилось ранее, все эти (и не только) вопросы (с ответами) обсуждались в т.ч. на http://bankir.ru/dom/forum/департамент- … -csp/page2 .
Вроде как, Вам уже про это писали. 100% не дам, т.к. сам не проверял, по вопросам: utf-8 без BOM, канонизация одна из стандарных для XML-Dsig (реализаций море...), нормализацию или смотрите на форуме или пишите сами. Кстати, можете поделиться, там же, своим  вариантом или готовой утилитой, так сказать в порядке взаимопомощи.

Т.к. все ведомства каждый раз придумывают свою уникальную версию трансформации ( в т.ч. нормализации) XML, никакие уже имеющиеся наработки могут не прокатить, и ЦБ тут не исключение. Т.е. то как делалось для СМЭВ , не соответствует тому, как это требуется при обмене ЭС с ЦБ. Да и у ЦБ имеется несколько своих вариантов трансформации.
ГОСТы у нас только на криптоалгоритмы и на CMS, если не ошибаюсь. На подписывание XML ГОСТов нет, к сожалению, в следствие чего,  такой бардак и творится.
Ну и, надеюсь, что про ПП-313 и ст.171 УК РФ, Ваше руководство в курсе.

8

Re: Сигнатура + C# для УФЭБС

Я делал так:

_vcertCtxForZK = new VcertObject();
_vcertCtxForZK.Initialize(_profileNameZK, VcertObject.InitializeFlags.UseRegistry);

Вам так же надо чтобы имена в первом параметре были полностью идентичны тем именам что указывали в справочнике сертификатов. В моём случае указывали просто "КА" и "ЗК".

9

Re: Сигнатура + C# для УФЭБС

Ну что за народ, вопросов на задают, и даже спасибо не скажут....

10

Re: Сигнатура + C# для УФЭБС

Всем большое спасибо за ответы. Не было возможности зайти на форум раньше.

11

Re: Сигнатура + C# для УФЭБС

Подскажите еще один вопрос...
UseRegistry - использовать профили Справочника из реестра вместо конфигурационного файла pki1.conf
А если использовать pki1.conf ? Где этот конфигурационный файл должен лежать?
Если положить его в %program files%\MDPREI\spki\ - то при инициализации ошибка: "Ошибка доступа к конфигурации"

12

Re: Сигнатура + C# для УФЭБС

Добрый день.
а -profile <имя> Вы используете при вызове утилиты?

13 (2017-10-12 17:24:00 отредактировано skj)

Re: Сигнатура + C# для УФЭБС

Добрый!
Здесь изначально речь шла про .Net SDK. Поэтому отвечая на Ваш вопрос - утилиту не использую. smile
Использую объект Validata.PKI.VcertObject и метод Initialize("Имя профиля из pki1.conf")

14

Re: Сигнатура + C# для УФЭБС

Конфигурационный файл профилей pki1.conf должен лежать в текущем каталоге вызывающего процесса.

15

Re: Сигнатура + C# для УФЭБС

Спасибо!