1

Тема: Работа с API. C# quick start

Здравствуйте!

Являюсь разработчиком, которому посчастливилось получить задание создать сервис что будет подписывать имеющиеся у нас файлы СКАД Сигнатурой для отправки в ЦБ. Сами файлы наш сервис уже формирует. Осталось их как-то подписать.
Прошу предоставить мне пошаговую инструкцию что нужно сделать и где это взять.

2

Re: Работа с API. C# quick start

Добрый день.

Для разработки Вам необходимо получить SDK к СКАД Сигнатура в Банке России.
Процесс работы с форматом УФЭБС (защита сообщений), описан на сайте Банка России http://www.cbr.ru/analytics/default.asp … ts&ch=.

3

Re: Работа с API. C# quick start

Здравствуйте!
Спасибо за ответ. Текущий статус сейчас это установлены дистрибутивы
1 - "Программа конфигурации СКЗИ СКАД Сигнатура" х64
2 - Справочник сертификатов х64

Тут первое это я так понимаю Ваш SDK, а второе то, к чему мне необходимо ещё получить ключи и сертификаты. Верно?
Это первое.

Второе в том, что когда я получу ключи эти, то мне надо запросить для .net приложения так называемый ППИ: Прикладной Программный Интерфейс СКАД Сигнатура. В его поставку будет включена dll'ка vcpi2.dll.  Она будет содержать функции, которые дёргают spki1.dll и используют уже её. Но мне, как программисту С# как раз и надо будет работать непосредственно с функциями vcpi2.dll.  Всё верно?

4

Re: Работа с API. C# quick start

Все верно.
ППИ это и есть SDK, ключи и сертификаты для разработки необходимо запрашивать в Банке России.

5

Re: Работа с API. C# quick start

Тогда получается что 2 программы это SDK ?

1 - "Программа конфигурации СКЗИ СКАД Сигнатура" х64
и
2 - "ППИ: Прикладной Программный Интерфейс СКАД Сигнатура" х64

И если это так, то чем они отличаются? Как вариант могу предположить что они отличаются тем что 1-ый для не .net, а второй для .net C#. Прошу прояснить этот момент..

6

Re: Работа с API. C# quick start

Программа конфигурации СКЗИ СКАД Сигнатура - программа настройки криптографического ядра
Справочник сертификатов - программа по работе с сертификатами включая библиотеку spki.dll реализующюю низкоуровневый функционал по работе с сертификатами
ППИ или SDK содержит заголовочные файлы, документацию для С++, .NET и тд.

7 (2017-07-25 17:31:11 отредактировано apirogov)

Re: Работа с API. C# quick start

А будет ли мне нужно настраивать это "криптографическое ядро"?
Я думал, что просто установлю ППИ, открою документацию где написано вызвать функции А, Б и Ц. Добавлю в студии ссылку на dll с указанными функциями. Вызову их, передавая туда сформированный файл xml, и получу другой файл. А другой уже отправлю в ЦБ вместо текущей xml'ки.

8

Re: Работа с API. C# quick start

Ядро нужно для настройки считывателей ключей и других параметров криптографии.
Наше ППИ не разбирает формат УФЭБС (xml-ку пихнуть не получится), рекомендую все таки почитать здесь http://www.cbr.ru/analytics/default.asp … ts&ch=.

9 (2017-07-25 18:27:39 отредактировано apirogov)

Re: Работа с API. C# quick start

Так там просто описание как составить xml'ку для той или иной платёжки. Меня заверили что согласно описанным правилам они у нас уже составляются. Вот только дальше нужно их как-то подписать. Для этого и ищется способ.. На текущий момент я так понимаю что мне нужно взять и установить ППИ для этого. В нём будет vcpi2.dll, а в ней функции что смогут это сделать. Или что-то не так ?

К примеру на входе в функцию будет файл, а на выходе zip архив, который формируется на основании ключа банка, в котором работаю. Zip содержит файл что был на входе и некий .sig файл. И такое считается что подписано. А дальше я просто это отправляю в ЦБ.

10

Re: Работа с API. C# quick start

Как подписать описывается в Документе УФЭБС_2017_2_1_Защита_ЭС.pdf из архива Официальное описание УФЭБС (Версия 2017.3.2, действующая с 03.07.2017) расположенного на страничке посвященной УФЭБС http://www.cbr.ru/analytics/default.asp … ts&ch=

11 (2017-07-26 11:50:36 отредактировано apirogov)

Re: Работа с API. C# quick start

Здравствуйте!
Я прочитал этот документ. Из него ясно что внутри xml вставляется секция <dsig:тратратра бла бла бла>, но не ясно какие функции API дёргать чтобы получить этот результат. Попросту говоря в документе, по больше части, "налита вода".

Посему вопрос в том, что где взять описание непосредственно того какие функции дёргать чтобы получить результат? И верно ли я понял, что этим результатом будет xml с секцией <dsig:тратратра бла бла бла> ?



То есть по сути нужно простое руководство вида 1 2 и 3, где вместо цифр будет что-то типа:
"1 - Скачать/получить дистрибутив ППИ, установить его, добавить в Visual Studio dll'ку такую-то
2 - Для того чтобы подписать xml'ку(заверить или ещё как-то в терминологии могу ошибаться) вызовите функцию такую-то.
3 - Для того чтобы убрать подпись/расшифровать назад, при необходимости, функцию такую-то"
И всё.

12

Re: Работа с API. C# quick start

Вам необходимо взять XML канонизировать и нормализировать по описанному в документе  УФЭБС_2017_2_1_Защита_ЭС алгоритму полученный результат передать в функцию выполнения ЭП. Результат выполнения ЭП подготовить и поместить в XML по описанному  в документе  УФЭБС_2017_2_1_Защита_ЭС алгоритму.
И всё.

13 (2017-07-28 12:58:55 отредактировано apirogov)

Re: Работа с API. C# quick start

Здравствуйте!

На текущий момент я получил настроенный справочник сертификатов и ключ от рутокен. В итоге есть и ключ и сертификат. Также "Программа конфигурации СКЗИ СКАД Сигнатура - программа настройки криптографического ядра" я так понял что настроена.

Жду когда будет получен ППИ. Параллельно изучаю алгоритм что просят сделать для подписи документа.
Вроде как шаги следующие:
1 - вырезать dsig:SigValue если оно есть в xml.

2 - нормализовать как-то (urn:cbr-ru:dsig:v1.1#normalization   - приведено упоминание вот этого. Что это и где взять?)

3 - канонизировать результат шага 2 (https://msdn.microsoft.com/ru-ru/library/system.security.cryptography.xml.xmldsigexcc14ntransform(v=vs.110).aspx)

4 - Загрузить полученный xml в память и передать как массив байт из памяти некой функции, что получу вместе с ППИ

5 - результат пункта 4 вернёт мне некий ЗК. Предположительно это строка. Надо его закодировать (https://stackoverflow.com/questions/11743160/how-do-i-encode-and-decode-a-base64-string). Если не строка, а байты то тоже кодировать, просто чутка иначе (https://msdn.microsoft.com/ru-ru/library/dhx0d524(v=vs.110).aspx).

6 - результат 5 обернуть так: "<dsig:SigValue>результат_пункта_5</dsig:SigValue>" и положить в начало xml'ки из пункта 3.

Всё верно?

14

Re: Работа с API. C# quick start

Добрый день.
Мы не разбирались с форматом УФЭБС. Обсуждения как это делать идет на форуме bankir.ru в следующих ветках:
http://bankir.ru/dom/forum/%D0%B4%D0%B5 … 0%BA%D0%B0
http://bankir.ru/dom/forum/%D0%B4%D0%B5 … %80/page11

15 (2017-07-28 17:43:36 отредактировано Saches)

Re: Работа с API. C# quick start

apirogov пишет:

.....Всё верно?

Приветствую!
Я бы еще добавил для расширения кругозора:
http://bankir.ru/dom/forum/департамент- … -csp/page4
http://bankir.ru/dom/forum/департамент- … ости/page5

А, вообще, при работе с криптографией,  неплохо бы держать в голове следующие вещи:
1. Все что касается криптографии в нашей стране регулирует ФСБ.
2. Любая деятельность, связанная с разработкой криптографии, её встраиванием или еще какими услугами с ней связанными, является лицензируемой деятельностью. Т.е. организация на данные виды деятельности должна получать лицензию ФСБ. Отсутствием такой лицензии, чревата в т.ч. уголовной статьей для руководства компании. И прецеденты такие известны.
3. Если в ПО куда Вы встраиваете СКЗИ обрабатывается конфиденциальная информация, защищаемая в соответствии с действующим законодательством, необходимо провести т.н. "тематические исследования" или, по простому, контроль встраивания. О необходимости этого мероприятия говорится , например, на сайте ФСБ
http://www.fsb.ru/fsb/science/single.ht … chart.html
При чем, на самом деле, это требование касается обработки не только персональных данных (ПДн), но и  платежей, банковской тайны и т.д. Т.е. всей той информации, которая упомянута в п.1.2., 552-П ЦБ РФ. Это то самое Положение ЦБ, результатом которого явилось то, что Вам поручили эту задачу (хотя, возможно, что я ошибаюсь smile ).
Для контроля встраивания, обращаться положено к разработчику СКЗИ (рекомендуется заранее уточнить о сроках и ценах). Хотя, можно это переложить и на банки, т.е. тех, кто будет Ваше ПО использовать (если, конечно, сами  Вы трудитесь в компании-разработчике).

Далее. В мире вообще и в Европе в  частности, существует целый ряд стандартов формализующих способы формирования электронной подписи (ЭП). Перечислять буду не все и не всё.
1. Для формирования ЭП файла любого формата, были разработаны следующие стандарты (каждый последующий. это развитие предыдущего). PKCS#7, CMS и европейский стандарт - CAdES.
Упрощенно, суть в следующем. берется любой файл, вычисляется ЭП (т.е. вычисляется хеш и шифруется закрытым ключом),  и, к самой ЭП, добавляется сертификат, открытый ключ, какие-то параметры, временные метки и т.д. и все это остается в двоичном виде. Далее, получившаяся последовательность байт присоединяется к исходному файлу или записывается в отдельный файл. Таким образом и получается attached/detached ЭП.
2. Для подписания (формирования ЭП) XML файлов были разработаны стандарты XML-DSig и в Европе XAdES. Там был реализован несколько иной подход:
2.1. Исходный XML файл определенным образом трансформируется, таким образом, что бы из него удалить все незначимые для подписываемых данных поля, теги, строки и символы (лишние пробелы, <CR><LF> переводят только в <LF> и т.д.). Это необходимо для того, что если в файле поменяли что-то "не значимое", ЭП при этом не менялась.
Как правило, эту трансформацию и называют канонизацией, приведением XML файла к некой канонической форме.
2.2. Далее все получаемые или используемые при подписании файла значения и величины преобразуют в текст (Base64), отдельно обрамляют соответствующими тегами и записывают в тот же XML.
Т.е. в теле исходного XML файла появляются отдельные, обрамленные соответствующими отдельными тегами, поля с ЭП, хешем, сертификатом, временными метками и т.д.

В и-нете навалом описания, исходников, программ для всевозможных стандартных канонизаций и подписаний.

Как это все реализовано у нас.
1. Наверное, у всех разработчиков СКЗИ, существуют утилиты командной строки, формирующие ЭП для любого файла в PKCS#7 или CMS, а может и в CAdES.
2. Каждое наше ведомство, включая ЦБ, при реализации обмена в виде XML файлов, придумывает свой очередной уникальный способ трансформации XML файлов, далее формирует подпись, как правило в PKCS#7 или CMS и запихивает его в XML в виде одного поля.

Т.е. у нас в стране, одновременно живет достаточно разношерстное множество способов формирования ЭП  для XML.
Все они не совместимы друг с другом, а наши программисты, похоже, никогда не останутся без работы.

Так, например, ЦБ, при трансформации XML для обмена платежами через АРМ КБР, использует вроде бы стандартную (одну из) канонизаций и, зачем-то, добавил еще некую нормализацию XML, исходя из каких-то своих представлений. При реализации им же обмена отчетностью в виде XML, используется неколько иной способ трансформации.
Зачем? хз, но тем не менее, это так. Ну и т.д. и т.п. На том же сайте bankir.ru в ветке автоматизаторов,  эти многочисленные форматы XML обмена регулярно обсуждаются.

Очень рекомендую, почитать в и-нете про все вышеперечисленные стандарты, посмотрите имеющееся (открытое) ПО в исходниках. Т.е. наберите некий базис и, потом, Вам будет легче общаться с программерами на сайте того же bankir.ru.
Начинать можно с http://www.w3.org/TR/xmldsig-core/, и вообще, яндекс/google Вам в руки.

И да, компания Валидата, к сожалению, не занимается реализацией ЭП для XML в формате УФЭБС. Т.е. вопросы Вы задаете определенно не на том форуме smile

В общем, как-то так. Надеюсь, сильно ни где не соврал....
Да прибудет с нами знание (т.е. сила) (с)

16 (2017-07-31 18:12:11 отредактировано apirogov)

Re: Работа с API. C# quick start

Здравствуйте!

Про "Контроль встраивания" мне известно. После того как сервис научится подписывать будет отдана dll'ка на анализ аффилированным ребятам. Дальше уже она получит "разрешение на работу" и будет подписывать все платёжки для ЦБ.

Итак есть 2 способа(условно):
№1 ("...PKCS#7, CMS и европейский стандарт - CAdES...");
№"2 ("... Для подписания (формирования ЭП) XML файлов были разработаны стандарты XML-DSig...")

а). Правильно ли я понимаю, что для моей цели мне не подходит способ номер 1? Согласно УФЭБС документу "УФЭБС_2017_2_1_Защита_ЭС" надо выбрать 1 из тех алгоритмов что в нём. Да?
б). Также нужен ли PKCS#7 ? Если да, то зачем? Я надеюсь что формировать это может и будет одна из функций ППИ, который мне выдадут как только смогут smile. А дальше останется только оборачивать в

apirogov пишет:

...
6 - результат 5 обернуть так: "<dsig:SigValue>результат_пункта_5</dsig:SigValue>" и положить в начало xml'ки из пункта 3.
...

и то не факт что самому. Вдруг ППИ уже умеет это делать.

17

Re: Работа с API. C# quick start

ППИ этого делать не умеет sad

18 (2017-07-31 18:26:56 отредактировано apirogov)

Re: Работа с API. C# quick start

Что именно не умеет? В чём конкретно расстраиваться мне sad?

19

Re: Работа с API. C# quick start

ППИ выдаст подпись в PKCS7 формате, далее ее придется конвертировать в BASE64. Вся работа с форматом УФЭБС ложится на Ваши плечи.

20

Re: Работа с API. C# quick start

Значит мне надо будет сформировать XML (это я так понимаю то что сервис делал и так.. всякие ED### по УФЭБС), канонизировать базовыми средствами MS и засунуть в оперативку(получил массив byte).

Затем передаю это одной из функций ППИ и она вернула мне подпись в PKCS7 формате. Пока предполагаю, что это строка. Так было бы проще наверное.. что из себя представляет эта "подпись PCKS7" ? Это строка?

Если всё верно, то дальше будет так:

ant пишет:

5 - результат пункта 4 вернёт мне некий ЗК. Предположительно это строка. Надо его закодировать (https://stackoverflow.com/questions/11743160/how-do-i-encode-and-decode-a-base64-string). Если не строка, а байты то тоже кодировать, просто чутка иначе (https://msdn.microsoft.com/ru-ru/library/dhx0d524(v=vs.110).aspx).
6 - результат 5 обернуть так: "<dsig:SigValue>результат_пункта_5</dsig:SigValue>" и положить в начало xml'ки из пункта 3.

21

Re: Работа с API. C# quick start

PKCS7  - PKCS (Public-Key Cryptography Standards). PKCS#7 (седьмой из набора стандартов PKCS). Это не строка, а бинарный массив. Детальное  описание PKCS7 сотрите тут https://tools.ietf.org/html/rfc2315 (к сожалению на английском). А так, по алгоритму все верно.
P.S. при вызове функции ППИ Вам необходимо подать флаг, что ЭП будет в отсоединенном формате (без тела подписанного сообщения).

22 (2017-08-08 11:33:46 отредактировано apirogov)

Re: Работа с API. C# quick start

Здравствуйте!

Сегодня наконец-то получил ППИ. В итоге представляет собой оно по сути только документацию с описанием функций и классов. Но нет примера как сделать что-то(аля msdn). Рассматривал для .net.

В итоге на просторах сети нашёл вот такой пример:

static void Main(string[] args)
        {
            try
            {
                VcertObject vcertCtx = new VcertObject();


                vcertCtx.Initialize();

                string dirInputFiles = "C:\\TestVcpia2";
                string dirWithEncryptedFiles = "C:\\TestVcpia2\\encrypt";
                string dirWithDecryptedFiles = "C:\\TestVcpia2\\decrypt";

                // encryption
                EncryptParameters eParams = new EncryptParameters();
                eParams.Flags = EncryptParameters.EncryptFlags.NoFlag;
                FindParameters fParams = new FindParameters();
                fParams.Flags = FindParameters.FindFlags.FindMy;
                CertificateCollection certs = vcertCtx.FindCertificates(fParams);
                foreach (Certificate c in certs)
                {
                    eParams.AddReceiver(c);
                }

                for (int i = 1; i < 61; i++)
                {
                    byte[] fileBytes = File.ReadAllBytes(dirInputFiles + i.ToString() + ".data");
                    byte[] encryptedMem = vcertCtx.EncryptMemory(eParams, fileBytes);
                    File.WriteAllBytes(dirWithEncryptedFiles + i.ToString() + ".data", encryptedMem);
                }

                // decription
                DecryptParameters dParams = new DecryptParameters();
                dParams.Flags = DecryptParameters.DecryptFlags.NoFlag;

                for (int i = 1; i < 61; i++)
                {
                    byte[] encryptedData = File.ReadAllBytes(dirWithEncryptedFiles + i.ToString() + ".data");
                    byte[] decryptedData = vcertCtx.DecryptMemory(dParams, encryptedData);
                    File.WriteAllBytes(dirWithDecryptedFiles + i.ToString() + ".data", decryptedData);
                }
            }
            catch (VcertException ex)
            {
                Console.WriteLine("VcertException: " + ex.Message);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }

Видимо пример для того как зашифровать(?) 60 файлов.

Какие проблемы:
1). имеет ли это отношение к подписанию?

2). Как это запустить? Добавил Service Reference на dll'ку vcpia2.dll, которая лежит чёрти где, так как в рамках ППИ нет никакого setup. Может надо было куда-то её подкинуть и уже туда на неё ссылаться?

3). Даже если на пункт 2 ответ: "лежать может vcpia2.dll где хочет", то у меня при запуске ругается что не находит spki1.dll (Не удается загрузить DLL "spki1.dll": Не найден указанный модуль. (Исключение из HRESULT: 0x8007007E)). Пробовал добавить service reference на неё - не видит в списке dll'ей папки System32. Однако она там физически лежит, в отличии от vcpia2. Как побороть эту ошибку? Как "запустить зверя" ? smile

23

Re: Работа с API. C# quick start

Код который Вы привели, это  зашифрование и расшифрование.
Для подписи страница 57-58 из документации

byte[] data = File.ReadAllBytes(fileName); 
SignParameters sp = new SignParameters(); 
sp.Pkcs7 = true; 
sp.Detached = false; 
byte[] sign = ctx.SignMemory(sp, data, null);

в вашем случае надо ставить

sp.Detached = true; 

Проблемы с не нахождением DLL могут быть связаны с разрядностью проекта и с разрядностью установленной Сигнатуры. Какая у Вас разрядность ОС? Разрядность Сигнатуры? Разрядность собираемого проекта?

24 (2017-08-08 11:29:57 отредактировано apirogov)

Re: Работа с API. C# quick start

Доброе утро!

- Система х64 win7;
- http://pastenow.ru/1X77S (СКЗИ и Справочник Сертификатов).
Предполагаю что справочник 64 и СКЗИ все х64, так как установлены по адресу: "C:\Program Files\..."   Например для СКЗИ: "C:\Program Files\Validata\VDCSP\vdcsp_cfg.exe"

Собираю в Debug AnyCPU. Фраемворк 4.5.2 на момент билда. Стоит флаг "Prefer 32-bit". В общем эти все опции по умолчанию. Я не менял их. Единственное что смог, так это добавить reference на dll'ку vcpia2.dll. Лежит она у меня не на диске С даже. На spki1.dll и на spki.dll добавить reference в проекте не вышло. Выдаёт ошибку. Притом если искать их в System32, то там он их вообще не видит. А когда копировал от туда в другое расположение, то окно Add Reference начинает их видеть(по новому адресу), но Exception при добавлении. Так что в проекте ссылка тока на vcpia2.dll.

25

Re: Работа с API. C# quick start

Для 32 х разрядных приложений, необходимо поставить справочник 32х. 64х сносить не надо, они отлично уживаются вместе.