Вход | Регистрация
 

Использование API честный знак

Использование API честный знак
Я
   cmex
 
01.06.20 - 11:16
Добрый день!
Для использования всех методов необходимо иметь УКЭП. Кто нибудь из 1С уже работал по API? Как получить тестовую УКЭП, как использовать уже имеющуюся УКЭП директора организации на Сервере, чтобы автоматом можно было подписывать? Кто сталкивался? Просветите, как процесс устроен? Слышал, про тестовый УЦ, где выдают УКЭП, но не понял как с этим работать. В общем, буду признателен за любую информацию
   cmex
 
1 - 01.06.20 - 14:21
up
   ChMikle
 
2 - 01.06.20 - 14:25
   cmex
 
3 - 01.06.20 - 17:08
(2) Спасибо
   timurhv
 
4 - 01.06.20 - 17:13
Тестовая УКЭП должна быть на имя директора (если стоит KIS, то его лучше закрыть, т.к. из-за сертификата тестового сервера не пускает дальше регистрировать):
https://ismp.wiki/index.php?title=Софт

Если выходит ошибка регистрации на тестовой площадке - писать в тех.поддержку ЧЗ.
   lodger
 
5 - 01.06.20 - 18:46
(0)
1) есть боевой и есть тестовый контур API
2) ключ можно использовать один и тот же.
3) нет нужды использовать ключ на сервере. достаточно сотворить токен авторизации на клиенте и отдать его на сервер.
4) у токена есть время жизни, 10 часов.
   cmex
 
6 - 02.06.20 - 13:29
(5) удалось получить сертификат в Тестовом подчиненном УЦ КриптоПро. Установил сертификат под своей учеткой в ОС
Далее пишу код 

ИнтеграционныйСтенд = "int01.gismt.crpt.tech/api/v3/true-api";
Соединение = Новый HTTPСоединение(ИнтеграционныйСтенд,,,,,, Новый ЗащищенноеСоединениеOpenSSL);
HTTPЗапрос = Новый HTTPЗапрос("/auth/key");
HTTPОтвет = Соединение.ВызватьHTTPМетод("GET", HTTPЗапрос);    
СтрокаJSON = HTTPОтвет.ПолучитьТелоКакСтроку();
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
Структура = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();

МенеджерКриптографии = Новый МенеджерКриптографии("Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider", "", 75);
Хранилище = МенеджерКриптографии.ПолучитьХранилищеСертификатов();
СертификатыХранилища = Хранилище.ПолучитьВсе();
Сертификат = СертификатыХранилища[0];    
ДД = ПолучитьДвоичныеДанныеИзСтроки(Структура.data);
Результат = МенеджерКриптографии.Подписать(ДД, Сертификат);

ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Структура);
СтрокаJSON = ЗаписьJSON.Закрыть();

Заголовки = Новый Соответствие;    
Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Заголовки.Вставить("cache-control", "no-cache");
HTTPЗапрос = Новый HTTPЗапрос("/auth/simpleSignIn", Заголовки);    
HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаJSON);
Попытка
    HTTPОтвет = Соединение.ВызватьHTTPМетод("POST", HTTPЗапрос);    
Исключение
    Сообщить(ОписаниеОшибки());
КонецПопытки;


Вываливается ошибка "Ошибка при получении свойства сертификата (0x00000000)"
Это я не так пользуюсь менеджером или этот ключ не может в принципе подписать? Читал про какой то закрытый ключ, но его в сертификате не увидел

Вот некая инфа по сертификату 
Версия    "V3"    Строка
ДатаНачала    01.06.2020 8:26:46    Дата
ДатаОкончания    01.09.2020 8:36:46    Дата
CN    "Тестовый подчиненный УЦ ООО "КРИПТО-ПРО" ГОСТ 2012 (УЦ 2.0)"    Строка

Крипто ПРО csp 4.0
   cmex
 
7 - 02.06.20 - 13:32
(5) у меня регламент будет работать с API, то есть сервер, поэтому на клиент доступа нет. может есть какой вариант другой? я слабо представляю как устроена вся схема работы эцп
   Garykom
 
8 - 02.06.20 - 13:37
(7) У вас два варианта или самим разбираться или кого то нанимать кто уже разобрался
   cmex
 
9 - 02.06.20 - 13:49
(8) почему 2? я бы помог, если бы знал, форму для этого и нужен, имхо
   cmex
 
10 - 02.06.20 - 13:58
(9) *форум
   Garykom
 
11 - 02.06.20 - 14:23
(9) Потому что там нет ничего сложного, обычная работа, которую бесплатно хрен кто будет делать.
Мануалы есть и они достаточно вменяемы, есть форум ЧЗ если что и прочие форумы.
В т.ч. как запросы по http делать или с криптопро/сертификатами работать
   Garykom
 
12 - 02.06.20 - 14:24
Ты конкретные вопросы задавай что не получается а не "помогите мне кто нибудь - сделайте за меня или дайте разжеванное/готовое"
   cmex
 
13 - 02.06.20 - 14:37
(12) ок, по мануалу разобрался. подписать вроде удалось, но в ответ на post запрос прилетает {"error_message":"Ошибка при проверке подписи"}

подписываю, кодирую и отправляю так

ДД = ПолучитьДвоичныеДанныеИзСтроки(data, КодировкаТекста.UTF8);
РезультатДД = МенеджерКриптографии.Подписать(ДД, Сертификат);
РезультатСтрока = Base64Строка(РезультатДД);

может я в двоичные данные строку исходную не так перевожу? как правильно подписать?
   Garykom
 
14 - 02.06.20 - 14:43
Вариант синтаксиса: Данные подписи сохраняются в файл
Синтаксис:
Подписать(<ИсходныеДанные>, <ВыходныеДанные>, <Сертификат>)
Параметры:
<ИсходныеДанные> (обязательный)
Тип: Строка, ДвоичныеДанные, Поток, ПотокВПамяти, ФайловыйПоток.
Исходные данные для подписывания.
Данные могут размещаться в файле (в этом случае указывается имя файла) или представлены как ДвоичныеДанные.
<ВыходныеДанные> (обязательный)
Тип: Строка: Поток, ПотокВПамяти, ФайловыйПоток.
Имя файла или поток, в который будут выгружены подписанные данные.
<Сертификат> (необязательный)
Тип: СертификатКриптографии.
Используемый сертификат криптографии.
Если параметр не указан, то в хранилище персональных сертификатов должен быть ровно один сертификат. В противном случае генерируется исключительная ситуация.
Описание варианта метода:
Подписанные данные записываются в файл. Возвращает Неопределено.
   cmex
 
15 - 02.06.20 - 14:46
(14) намекаете, что надо пописать строку, предварительно не переводя в ДД?
   cmex
 
16 - 02.06.20 - 14:46
(15) *подДписать)
   Garykom
 
17 - 02.06.20 - 14:47
(14)+ Только уверен что апи требует прикрепленную подпись?
Если нужна открепленная то стандартный менеджер не пойдет и надо нечто вроде http://catalog.mista.ru/public/1058940/
   cmex
 
18 - 02.06.20 - 14:47
(17) из Мануала -  data String + Подписанные УКЭП зарегистрированного УОТ случайные данные в base64 (ЭП
присоединенная)
   Garykom
 
19 - 02.06.20 - 14:47
(16) А фуй знает что надо, надо разбираться

Лично я не имею представления по какому мануалу и что твоя делать
   cmex
 
20 - 02.06.20 - 14:48
(19) v5 - Документация для партнёров по True API
   Garykom
 
21 - 02.06.20 - 14:49
(18) Тогда попробуй имя файла входного и выходного указывать в Подписать
А затем сравнить с тем что выходит другими способами подписи того же файла.
Есть у криптопро cryptcp и csptest
   Garykom
 
22 - 02.06.20 - 14:51
   Garykom
 
23 - 02.06.20 - 14:55
   cmex
 
24 - 02.06.20 - 15:30
все попробовал - не взлетает пока. чую, что близко, но пока никак
   timurhv
 
25 - 02.06.20 - 16:27
Процедура ОбновитьТокен(ВидAPI, СледующееОповещение)
    АдресМетода = "/api/v3/auth/cert/key";
    ...
    HTTPСервисЗапрос = Новый HTTPСоединение(СтруктураПодключения[АдресAPI],,,,,60, Новый ЗащищенноеСоединениеopenSSL());
    Запрос = Новый HTTPЗапрос(АдресМетода);
    Ответ = HTTPСервисЗапрос.Получить(Запрос);
    Если Ответ.КодСостояния = 200 Тогда
        ...
        МассивСертификатов = Новый Массив();
        Если ЗначениеЗаполнено(СертификатыКлючейЭлектроннойПодписиИШифрования) Тогда
            МассивСертификатов.Добавить(СертификатыКлючейЭлектроннойПодписиИШифрования);
        КонецЕсли;
        СтруктураОсновныхДанных = Новый Структура();
        СтруктураОсновныхДанных.Вставить("СтрокаJSON", ОтветСтруктура.data);
        СтруктураОсновныхДанных.Вставить("МассивСертификатов", МассивСертификатов);
        СтруктураОсновныхДанных.Вставить("Открепленная", Ложь);
        СтруктураОсновныхДанных.Вставить("СсылкаДокумента", "");
        
        СтруктураДополнительныхДанных = Новый Структура();
        СтруктураДополнительныхДанных.Вставить("СертификатПользователя", СертификатыКлючейЭлектроннойПодписиИШифрования);
        СтруктураДополнительныхДанных.Вставить("ОтветСтруктура", ОтветСтруктура);
        СтруктураДополнительныхДанных.Вставить("СледующееОповещение", СледующееОповещение);
        СтруктураДополнительныхДанных.Вставить("HTTPСервисЗапрос", HTTPСервисЗапрос);
        ИнтеграцияИСМПСлужебныйКлиент.Подписать(СтруктураОсновныхДанных, Новый ОписаниеОповещения("ОбработатьСообщения_ПриЗавершенииОперацииПодписи", ЭтотОбъект, СтруктураДополнительныхДанных));
    КонецЕсли;
КонецПроцедуры

Процедура ОбработатьСообщения_ПриЗавершенииОперацииПодписи(ПодписанныеСообщения, Контекст) Экспорт
    Если ПодписанныеСообщения = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    Для Каждого ЭлементСообщения Из ПодписанныеСообщения Цикл
        ПодписанныйФайл = ИнтеграцияИСКлиентСервер.ДвоичныеДанныеBase64(ЭлементСообщения.СвойстваПодписи.Подпись);
        HTTPСервисЗапрос = Контекст.HTTPСервисЗапрос;
        Тело = "{
        |""uuid"": """ + Контекст.ОтветСтруктура.uuid + """,
        |""data"": """ + ПодписанныйФайл + """
        |}";
        АдресМетода = "api/v3/auth/cert/";
        HTTPЗапрос = Новый HTTPЗапрос(АдресМетода);
        HTTPЗапрос.Заголовки.Вставить("Content-Type","application/json;charset=UTF-8");
        HTTPЗапрос.УстановитьТелоИзСтроки(Тело);
        Ответ = HTTPСервисЗапрос.ОтправитьДляОбработки(HTTPЗапрос);
    КонецЦикла;
КонецПроцедуры
   timurhv
 
26 - 02.06.20 - 16:41
(13) Base64 = Base64Строка(ДвоичныеДанные);
Base64 = СтрЗаменить(Base64, Символы.ПС, "");
Base64 = СтрЗаменить(Base64, Символы.ВК, "");

Символы переноса скорее забыли убрать
   cmex
 
27 - 03.06.20 - 11:16
(26) это из какой конфы? ИнтеграцияИСКлиентСервер.ДвоичныеДанныеBase64(ЭлементСообщения.СвойстваПодписи.Подпись);
   cmex
 
28 - 03.06.20 - 11:33
кажись разобрался, вернусь с результатом
   cmex
 
29 - 03.06.20 - 17:18
причина была в том, что 1совский метод Подписать НЕ включает данные в подпись, как того требует ЧЗ. Для этого необходимо использовать внешнюю компоненту.
вот код рабочий. саму компоненту дернул из 11.4

МенеджерКриптографии = Новый МенеджерКриптографии("Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider", "", 80);
    Хранилище = МенеджерКриптографии.ПолучитьХранилищеСертификатов();
    СертификатыХранилища = Хранилище.ПолучитьВсе();
    Сертификат = СертификатыХранилища[0];
    
    Макет = ПолучитьМакетНаСервере();
    Адрес = ПоместитьВоВременноеХранилище(Макет);     
    Если ПодключитьВнешнююКомпоненту(Адрес, "XMLDSignAddInSymbolicName", ТипВнешнейКомпоненты.Native) Тогда
        Попытка
            ОбъектКомпоненты = Новый("AddIn.XMLDSignAddInSymbolicName.XMLDSignAddIn");
            Если ОбъектКомпоненты = Неопределено Тогда 
                ВызватьИсключение НСтр("ru = 'Оператор Новый вернул Неопределено'");
            КонецЕсли;
        Исключение
            ВызватьИсключение НСтр("ru = 'Не удалось чуток'");            
        КонецПопытки;        
    КонецЕсли;    
    ОбъектКомпоненты.ПутьККриптопровайдеру = "";
    СертификатКриптографииBase64 = СертификатКриптографииBase64(Сертификат.Выгрузить());    
    Попытка
        SignatureValue = ОбъектКомпоненты.CMSSign(
            Структура.data,//данные тип строка

            СертификатКриптографииBase64,//выгруженный в ДД сертификат в base64

            "",//пароль

            0,//тип подписи "CAdES-BES"

            Ложь,//открепленная

            17,//РежимВключенияСертификатовКриптографии.ВключатьПолнуюЦепочку

            0)//тип входных данных Строка;

    Исключение
        ВызватьИсключение НСтр("ru = 'Ошибка вызова метода CMSSign компоненты XMLDSig.'") + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
    КонецПопытки;    
    Подпись = Base64Значение(SignatureValue);
    
    Структура.data = ДвоичныеДанныеBase64(Подпись);
    
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON, Структура);
    СтрокаJSON = ЗаписьJSON.Закрыть();
    
    Заголовки = Новый Соответствие;    
    Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
    Заголовки.Вставить("cache-control", "no-cache");
    HTTPЗапрос = Новый HTTPЗапрос("/auth/simpleSignIn", Заголовки);    
    HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаJSON);
    Попытка
        HTTPОтвет = Соединение.ВызватьHTTPМетод("POST", HTTPЗапрос);    
    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;
    
    Если Не HTTPОтвет.КодСостояния = 200 Тогда
        Сообщить("Код состояния не равен 200");
        Возврат;
    КонецЕсли;
    
    СтрокаJSON = HTTPОтвет.ПолучитьТелоКакСтроку();
    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
    Структура = ПрочитатьJSON(ЧтениеJSON);
    ЧтениеJSON.Закрыть();
    
    Токен = Структура.token;
   timurhv
 
30 - 04.06.20 - 10:10
(29) БСП нет разве в конфе?
 
 Рекламное место пустует
   cmex
 
31 - 04.06.20 - 13:14
(30) нет, 11.1
   VitShvets
 
32 - 19.06.20 - 16:51
(29) Спасибо тебе, добрый человек.


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.