Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

API Честного Знака

API Честного Знака
Я
   igel1969
 
12.03.20 - 19:10
Кто-нибудь смог соединиться с авторизацией к API Честного знака?
У меня по их документации получилось только два GET-запроса и ни одного POST.

Вот из их описания:
Пример запроса:
POST <url стенда>/auth/simpleSignIn
Content-Type: application/json; charset=utf-8
Postman-Token: 5325d8aa-ba27-44c5-9b10-c02da19f1b0c
cache-control: no-cache
[
    {
        "uuid": "a63ff582-b723-4da7-958b-453da27a6c62",
        "data": "efd833c7248544dca05bff1036bea6"
    },
    {
        "uuid": "4a5c679e-af37-46a6-ad79-8fc0cd5271c4",
        "data": "tro965c0124567uie74fbh1223uer2"
    }
]

Откуда мне взять Postman-Token? (Ключ ЕТокен у меня есть).
В тело запроса писать из примера с квадратными скобками или без?
У меня на этот запрос все время отвечает
<html>
<head><title>307 Temporary Redirect</title></head>
<body>
<center><h1>307 Temporary Redirect</h1></center>
<hr><center>nginx</center>
</body>
</html>


Есть у кого-нибудь пример реально работающего кода связи с этим Честным знаком, буд они неладны (хотя они и так неладны)?
   big
 
1 - 12.03.20 - 20:10
Немного непонятна операция, которую вы делаете? Это какой-то упрощенный способ авторизации, судя по simpleSignIn?

Я получаю токен сначала получая от ЧЗ случайные данные, подписываю его ЭЦП и отправив его затем в ЧЗ. В ответ приходит JSON с токеном.
Под рукой нет документации, только на работе.
   big
 
2 - 12.03.20 - 20:12
(1) Да, и это на 7.7
   igel1969
 
3 - 12.03.20 - 20:14
(2) А можно кусок кода, пожалуйста?
Я через 1С подписывать ЭЦП не умею.
Я тоже сперва получаю через GET-запрос случайные данные, а вот то что я написал тут в (0) - это как раз запрос, чтобы получить JSON с токеномвидимо, но я не могу его добиться.
   big
 
4 - 12.03.20 - 20:29
Подписываем файл со случайными данными. В файле ИмяФайла данные из data, то бишь те самые случайные. В файле ИмяФайлаПодп будут уже подписанные данные. Отпечаток - это отпечаток ЭЦП, строка из букв и цифр (получаем через объект CaDESCOM)
"C:\Program Files (x86)\Crypto Pro\CSP\csptest.exe" -sfsign -sign -in "+ИмяФайла+" -out "+ИмяФайлаПодп+" -my "+Отпечаток+" -base64 -add

Из полученного файла надо убрать все символы перевода строк и разделителя строк. Полученную строку СтрИтог используем уже в запросе с uuid
Текст    = СоздатьОбъект("Текст");
Текст.ДобавитьСтроку("{""uuid"":"""+СокрЛП(СессияUuid)+""",""data"":""" + СтрИтог + """}");
Текст.Записать(ИмяФайлаПодп);

Отправляем запрос. ИмяСервиса - это уже по месту. Или тестовый, или боевой. Но тестовый вроде у них не работает, не получилось у меня.

curl.exe -X POST "+ИмяСервиса+"/auth/cert/ -H ""content-type: application/json;charset=UTF-8"" --data-binary @"+ИмяФайлаПодп + " -v -k --output " + ФайлОтвета;


Код вставлял из рабочей обработки, попутно выправляя для читабельности. Могут быть нестыковки, но принцип должен быть понятен.
   big
 
5 - 12.03.20 - 20:31
(4) ФайлОтвета - в нём будет JSON с токеном.
   igel1969
 
6 - 12.03.20 - 20:41
(5) (4) Спасибо большое, завтра попробую. Вроде все понятно.
   igel1969
 
7 - 13.03.20 - 09:21
(4) Так и не смог ((( совсем в этих технологиях плаваю вслепую.

попробовал:
Отпечаток = "16 2d ec 08 71 14 1f 18 27 08 24 79 9e d2 e0 f1 ee 52 f1 71"; (для данного форума поменял несколько цифр в отпечатке).
ЗапуститьПриложение("C:\Program Files (x86)\Crypto Pro\CSP\csptest.exe -sfsign -sign -in "+ ФайлИН + " -out " + ФайлАут + " -my " + Отпечаток + " -base64 -add");

выходит список из трех сертификатов, просит выбрать нужный. когда выбираю - ФайлАут не обнаружен, значит в него ничего не записалось.
Отпечаток я взял таким образом - в КриптоПро нашел сертификат в контейнере, зашел в его свойства, там есть строка "отпечаток", ее тупо скопировал.
   Cyberhawk
 
8 - 13.03.20 - 10:08
(7) Сколько тебе платят за решение вопроса?
   igel1969
 
9 - 13.03.20 - 10:10
я на окладе ))
   big
 
10 - 13.03.20 - 10:39
(7) И пробелы в отпечатке так же присутствуют? И, кстати, сам ключ где находится - в реестре или на каком другом носителе?
   big
 
11 - 13.03.20 - 10:42
(7) Если быть точным, то командная строка неверная. В кавычки надо заключить "C:\Program Files (x86)\Crypto Pro\CSP\csptest.exe". То есть в реальной 1С путь до csptest.exe надо заключить в двойные кавычки. Пробуйте сначала запускать из cmd или bat
   igel1969
 
12 - 13.03.20 - 10:45
(10) пробелы присутствуют. убирать пробовал - просто пролетает все, но файл не создается. сам ключ в реестре.
   igel1969
 
13 - 13.03.20 - 10:55
(11) ха, через командную строку получилось (отпечаток без пробелов вводил). есть над чем подумать теперь, спасибо
   big
 
14 - 13.03.20 - 10:58
(13) В пути файлов нет русских букв?
   Garykom
 
15 - 13.03.20 - 11:01
(7) >Отпечаток = "16 2d ec 08 71 14 1f 18 27 08 24 79 9e d2 e0 f1 ee 52 f1 71";

пробелы убери юморист
   Garykom
 
16 - 13.03.20 - 11:03
(7) >когда выбираю - ФайлАут не обнаружен, значит в него ничего не записалось.

ыыы а у тебя ФайлАут с полным путем или как? вот ты csptest с полным путем запускашь а как думаешь куда он запишет ФайлАут ?
   Garykom
 
17 - 13.03.20 - 11:04
(16)+ Ну и пуск > cmd и туда команду и смотрим на что ругается
или делаешь батник с pause в конце запускаешь и смотришь что пишет
   igel1969
 
18 - 13.03.20 - 11:05
(17) да, так и собираюсь
   Garykom
 
19 - 13.03.20 - 11:06
(18) Советую сразу с csptest перейти на cryptcp
   big
 
20 - 13.03.20 - 11:11
(19) А смысл? Шифровать то ничего не нужно.
   big
 
21 - 13.03.20 - 11:16
Выяснилась интересная особенность при подписывании из командной строки. При подписывании надо указать или наименование сертификата, или его отпечаток. В случае запуска 32-разрядной csptest, работают оба варианта. Если же запускать 64-разрядную версию, то работает только через указание наименования.
   igel1969
 
22 - 13.03.20 - 11:23
в общем, подписать удалось. оно и раньше видимо работало, проблема была не в КриптоПро, а в 1С и временных файлах.
Смотрите:
ФайлИн = ПолучитьИмяВременногоФайла();
дает нам вот такое имя:
C:\Users\admin\AppData\Local\Temp\v8_264_83.tmp
Хотя на самом деле когда записываешь в файл
ТекстовыйФайл = Новый ТекстовыйДокумент;
ТекстовыйФайл.УстановитьТекст(data);
ТекстовыйФайл.Записать(ФайлИн, КодировкаТекста.UTF8);

, то записывает в 
C:\Users\admin\Local Settings\Temp\v8_264_83.tmp
Как так - я не понимая, если честно.

строка получается
"C:\Program Files (x86)\Crypto Pro\CSP\csptest.exe" -sfsign -sign -in C:\Users\admin\AppData\Local\Temp\v8_264_83.tmp -out C:\Users\admin\AppData\Local\Temp\v8_264_84.tmp -my 11111ОТПЕЧАТОКee52f171 -base64 -add

Но ответ записывается тоже в папку C:\Users\admin\Local Settings\Temp
Глюк какой-то.

И вот когда я потом пробовал прочитать ответ из файла:
Ответ = Новый ТекстовыйДокумент();
Ответ.Прочитать(ФайлАут, КодировкаТекста.UTF8);
ТекстОтвета = Ответ.ПолучитьТекст();

Мне сообщало что не может найти такой файл.
   big
 
23 - 13.03.20 - 11:26
Ёшки-матрёшки!! Так в 8-ке же есть свои объекты для работы с криптой! Зачем этот огород городить с командной строкой? Я ни разу не восьмёрошник, но даже я это знаю
   igel1969
 
24 - 13.03.20 - 11:30
(23) тут Вы хоть какой-то пример дали и крохотными шажочками я по нему подбираюсь к результату.
А по МенеджерКриптографии в интернете вообще тишина.
Каким текстом заполнять параметры задавать при создании объекта? Нигде не написано.
   igel1969
 
25 - 13.03.20 - 11:32
(23) МенеджерКриптографии = Новый МенеджерКриптографии("Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider", "", 75);
откуда тут все эти циферки?
   igel1969
 
26 - 13.03.20 - 12:14
и вообще глюк былв том, что я не дожидался исполнения команды, потому и не было выходного файла.
   big
 
27 - 13.03.20 - 13:55
(26) Лучше запускать через COMSPEC
Функция локКомандаСистемы(Команда,Реж=0, ТипЗапуска = "c")
    // Реж    0 - окно не отображается

    //     1 - активизирует и отображает окно

    //     2 - активизирует окно и отображает его в свернутом виде

    //     3 - активизирует окно и отображает его в максимизированном виде

    //

    // ТипЗапуска    c - выход по завершении выполнения команды

    //         k - ожидание команды пользователя

    
    WshShell=СоздатьОбъект("WScript.Shell");
      WshShell.Run("%COMSPEC% /"+ТипЗапуска+" "+Команда, Реж, 1)
КонецФункции
   victuan1
 
28 - 16.03.20 - 08:26
(27) Чем лучше? У самого Shell есть подобные режимы запуска.
   big
 
29 - 16.03.20 - 08:46
(28) Как я понял ТС-а - у него 1С не дожидается окончания работы командной строки. Как там в 8-ке не знаю, потому и присоветовал такой вариант
   Лодырь
 
30 - 16.03.20 - 08:59
(29) В 8ке есть МенеджерКриптографии и наверное правильнее использовать его. Надо подумать на эту тему. Благо топикстартер явно размышлял над встроенными средствами.
 
 Рекламное место пустует
   Necessitudo
 
31 - 16.03.20 - 18:04
#Область Электронная_подпись


// sThumbprint - отпечаток сертификата, используемого для подписи; строка, представляющая отпечаток в шестнадцатеричном виде

// пример 195934d72dcdf69149901d6632aca4562d8806d8
//

// ТекстДляПодписи должен быть в Base64
//

//bDetached - Истина/Ложь - откреплённая/прикреплённая подпись
Функция ПодписатьТекст(ТекстДляПодписи, sThumbprint, bDetached)
    
    CADESCOM_BASE64_TO_BINARY = 1;// Входные данные пришли в Base64

    
    CADESCOM_CADES_TYPE = 1;// Тип усовершенствованной подписи

    //bDetached     = Ложь;

    EncodingType = 0;
    
    oSigner = Новый COMОбъект("CAdESCOM.CPSigner");// Объект, задающий параметры создания и содержащий информацию об усоверш-ной подписи

    oSigner.Certificate = ComОбъектСертификатаПоОтпечатку(sThumbprint);
    
    oSignedData = Новый COMОбъект("CAdESCOM.CadesSignedData");// Объект CadesSignedData предоставляет свойства и методы для работы с усоверш-ной подписью.

    oSignedData.ContentEncoding = CADESCOM_BASE64_TO_BINARY;
    oSignedData.Content = ПеревестиДанныеВBase64(ТекстДляПодписи);    
    
    sSignedMessage = oSignedData.SignCades(oSigner, CADESCOM_CADES_TYPE, bDetached, EncodingType);// Метод добавляет к сообщению усовершенствованную подпись.

    
    Возврат sSignedMessage;// Подпись в формате Base64

    
КонецФункции

// Получить Com-объект сертификата по отпечатку.

// 
// Параметры:

//     Отпечаток - Строка - отпечаток сертификата, используемого для подписи; строка, представляющая отпечаток в шестнадцатеричном виде
//                          пример 195934d72dcdf69149901d6632aca4562d8806d8

// Возвращаемое значение:
//     ComОбъект - Com-объект сертификата.

Функция ComОбъектСертификатаПоОтпечатку(Отпечаток)
    
    CAPICOM_CURRENT_USER_STORE         = 2;    // 2 - Искать сертификат в ветке "Личное" хранилища.

    CAPICOM_MY_STORE                   = "My";// Указываем, что ветку "Личное" берем из хранилища текущего пользователя

    CAPICOM_STORE_OPEN_READ_ONLY       = 0;    // Открыть хранилище только на чтение

    CAPICOM_CERTIFICATE_FIND_SHA1_HASH = 0;
    
    oStore = Новый COMОбъект("CAdESCOM.Store");// Объект описывает хранилище сертификатов

    oStore.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE, CAPICOM_STORE_OPEN_READ_ONLY);// Открыть хранилище сертификатов

    
    Certificates = oStore.Certificates.Find(CAPICOM_CERTIFICATE_FIND_SHA1_HASH, Отпечаток);
    ComОбъект = Certificates.Item(1);// Найденный сертификат (Com-объект)

    
    oStore.Close();// Закрыть хранилище сертификатов и освободить объект

    
    Возврат ComОбъект;
    
КонецФункции

Функция ПолучитьСписокДоступныхСертификатов() Экспорт
    
    //Получим список доступных сертификатов

    CAPICOM_CURRENT_USER_STORE = 2;
    //2 - Искать сертификат в ветке "Личное" хранилища.

    
    CAPICOM_MY_STORE = "My";
    // Указываем, что ветку "Личное" берем из хранилища текущего пользователя

    
    CAPICOM_STORE_OPEN_READ_ONLY = 0;// Открыть хранилище только на чтение

    
    СписокСертификатов = Новый СписокЗначений;
    
    Попытка
        oStore = Новый COMОбъект("CAdESCOM.Store");// Объект описывает хранилище сертификатов

        oStore.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE, CAPICOM_STORE_OPEN_READ_ONLY);
        // Открыть хранилище сертификатов

        
        Для Каждого ТекСертификат Из oStore.Certificates Цикл
            СписокСертификатов.Добавить(ТекСертификат.Thumbprint, ТекСертификат.SubjectName);    
        КонецЦикла;
        
        oStore.Close();// Закрыть хранилище сертификатов и освободить объект

    Исключение
        
        #Если Клиент Тогда

            СообщитьОбОшибке(ОписаниеОшибки());            
        #КонецЕсли        

    КонецПопытки;
    
    Возврат СписокСертификатов;
    
КонецФункции

#КонецОбласти
   Garykom
 
32 - 16.03.20 - 19:17
(30) Если 8-ка то да МенеджерКриптографии, если нет проблем с его применением &НаСервере
   igel1969
 
33 - 17.03.20 - 14:12
(29) можно продолжить? я так и не достиг результата ((((((((((.
я хотел спросить - после подписания date у Вас тоже становится длиной около 5000 знаков? просто в документации по API в примере подписанная date такой же длины как и не подписанная.


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