Имя: Пароль:
1C
1С v8
API Честного Знака
0 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>


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

Я получаю токен сначала получая от ЧЗ случайные данные, подписываю его ЭЦП и отправив его затем в ЧЗ. В ответ приходит JSON с токеном.
Под рукой нет документации, только на работе.
2 big
 
12.03.20
20:12
(1) Да, и это на 7.7
3 igel1969
 
12.03.20
20:14
(2) А можно кусок кода, пожалуйста?
Я через 1С подписывать ЭЦП не умею.
Я тоже сперва получаю через GET-запрос случайные данные, а вот то что я написал тут в (0) - это как раз запрос, чтобы получить JSON с токеномвидимо, но я не могу его добиться.
4 big
 
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 " + ФайлОтвета;


Код вставлял из рабочей обработки, попутно выправляя для читабельности. Могут быть нестыковки, но принцип должен быть понятен.
5 big
 
12.03.20
20:31
(4) ФайлОтвета - в нём будет JSON с токеном.
6 igel1969
 
12.03.20
20:41
(5) (4) Спасибо большое, завтра попробую. Вроде все понятно.
7 igel1969
 
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");

выходит список из трех сертификатов, просит выбрать нужный. когда выбираю - ФайлАут не обнаружен, значит в него ничего не записалось.
Отпечаток я взял таким образом - в КриптоПро нашел сертификат в контейнере, зашел в его свойства, там есть строка "отпечаток", ее тупо скопировал.
8 Cyberhawk
 
13.03.20
10:08
(7) Сколько тебе платят за решение вопроса?
9 igel1969
 
13.03.20
10:10
я на окладе ))
10 big
 
13.03.20
10:39
(7) И пробелы в отпечатке так же присутствуют? И, кстати, сам ключ где находится - в реестре или на каком другом носителе?
11 big
 
13.03.20
10:42
(7) Если быть точным, то командная строка неверная. В кавычки надо заключить "C:\Program Files (x86)\Crypto Pro\CSP\csptest.exe". То есть в реальной 1С путь до csptest.exe надо заключить в двойные кавычки. Пробуйте сначала запускать из cmd или bat
12 igel1969
 
13.03.20
10:45
(10) пробелы присутствуют. убирать пробовал - просто пролетает все, но файл не создается. сам ключ в реестре.
13 igel1969
 
13.03.20
10:55
(11) ха, через командную строку получилось (отпечаток без пробелов вводил). есть над чем подумать теперь, спасибо
14 big
 
13.03.20
10:58
(13) В пути файлов нет русских букв?
15 Garykom
 
гуру
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";

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

ыыы а у тебя ФайлАут с полным путем или как? вот ты csptest с полным путем запускашь а как думаешь куда он запишет ФайлАут ?
17 Garykom
 
гуру
13.03.20
11:04
(16)+ Ну и пуск > cmd и туда команду и смотрим на что ругается
или делаешь батник с pause в конце запускаешь и смотришь что пишет
18 igel1969
 
13.03.20
11:05
(17) да, так и собираюсь
19 Garykom
 
гуру
13.03.20
11:06
(18) Советую сразу с csptest перейти на cryptcp
20 big
 
13.03.20
11:11
(19) А смысл? Шифровать то ничего не нужно.
21 big
 
13.03.20
11:16
Выяснилась интересная особенность при подписывании из командной строки. При подписывании надо указать или наименование сертификата, или его отпечаток. В случае запуска 32-разрядной csptest, работают оба варианта. Если же запускать 64-разрядную версию, то работает только через указание наименования.
22 igel1969
 
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);
ТекстОтвета = Ответ.ПолучитьТекст();

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

Функция локКомандаСистемы(Команда,Реж=0, ТипЗапуска = "c")
    // Реж    0 - окно не отображается
    //     1 - активизирует и отображает окно
    //     2 - активизирует окно и отображает его в свернутом виде
    //     3 - активизирует окно и отображает его в максимизированном виде
    //
    // ТипЗапуска    c - выход по завершении выполнения команды
    //         k - ожидание команды пользователя
    
    WshShell=СоздатьОбъект("WScript.Shell");
      WshShell.Run("%COMSPEC% /"+ТипЗапуска+" "+Команда, Реж, 1)
КонецФункции
28 victuan1
 
16.03.20
08:26
(27) Чем лучше? У самого Shell есть подобные режимы запуска.
29 big
 
16.03.20
08:46
(28) Как я понял ТС-а - у него 1С не дожидается окончания работы командной строки. Как там в 8-ке не знаю, потому и присоветовал такой вариант
30 Лодырь
 
16.03.20
08:59
(29) В 8ке есть МенеджерКриптографии и наверное правильнее использовать его. Надо подумать на эту тему. Благо топикстартер явно размышлял над встроенными средствами.
31 Necessitudo
 
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(); // Закрыть хранилище сертификатов и освободить объект
    Исключение
        
        #Если Клиент Тогда
            СообщитьОбОшибке(ОписаниеОшибки());            
        #КонецЕсли        
    КонецПопытки;
    
    Возврат СписокСертификатов;
    
КонецФункции

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