Имя: Пароль:
1C
1С v8
1С/Linux/ Подпись(шифрование) данных передаваемых Post Запросом.
,
0 drey1912
 
16.09.19
18:50
Доброго времени суток!
Есть такая проблема: Есть некая API, для передачи данных в которую требуется подписывать тело запроса при помощи сгенерированного privatekey.pem.
Потом кодировать это всё в base64 и вставлять в заголовок запроса X-Request-Signature. Система Ubuntu 16.04.


"тело запроса складываете в файл, командой openssl подписываете файл - получаете бинарник подписи, его в base64 и в заголовок."(с)
Это цитата ТП клиента. В целом всё понятно, непонятно как это сделать средствами 1С!

Есть такая тема: HTTP запрос Post и подпись
Ее изучение не дало ответа как подписать этот файл...
Подскажите, может сталкивались?
1 novichok79
 
16.09.19
19:02
что-то типа такого


    СертификатКлиента = Неопределено;
    Если Настройки.ИспользоватьСертификат И ЗначениеЗаполнено(ТипСертификата) Тогда
        ИмяФайлаСертификата = ПолучитьИмяВременногоФайла(ТипСертификата);
        Настройки.ДанныеСертификата.Записать(ИмяФайлаСертификата);
        СертификатКлиента = Новый СертификатКлиентаФайл(ИмяФайлаСертификата, Настройки.ПарольСертификата);
        Попытка
            УдалитьФайлы(ИмяФайлаСертификата);
        Исключение
            Комментарий = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
            ЗаписьЖурналаРегистрации(Словарь.КорневоеСобытие(), УровеньЖурналаРегистрации.Ошибка, , , Комментарий);
        КонецПопытки;
    КонецЕсли;
    Если Настройки.СпособАутентификации = Перечисления.СпособыАутентификации.ОбычнаяПроверка Тогда
        Логин = Настройки.Логин;
        Пароль = Настройки.Пароль;
    Иначе
        Логин = Неопределено;
        Пароль = Неопределено;                                                              
    КонецЕсли;     
    ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(СертификатКлиента, Новый СертификатыУдостоверяющихЦентровОС);
    Соединение = Новый HTTPСоединение(Сервер, Порт, Логин, Пароль, , 30, ЗащищенноеСоединение);
    Запрос = Новый HTTPЗапрос(ПутьНаСервере);
    Запрос.УстановитьТелоИзСтроки(ДанныеОповещения);
2 novichok79
 
16.09.19
19:05
по поводу base64, вроде так можно было. без гугла.
СтрокаBase = Base64Строка(ТвоиДвоичныеДанные);
3 Скиурус
 
16.09.19
19:06
Да как ТП клиента написали, так и сделай. Запиши тело запроса в файл на диске, вызови КомандойСистемы openssl, потом прочитай полученный бинарник, закодируй его с помощью Base64Строка и отправь
4 drey1912
 
16.09.19
19:10
(2) Эм, мне надо мои двоичные данные подписать для начала. Потом уже в base64. (3) Это не разовая акция, а по 500 запросов в день примерно и соответственно 500 подписей, а ты как я понимаю предлагаешь подписать файл через консоль?
Если нет, то подскажи как из под 1с выполнять консольные команды Linux, не работал раньше на этой системе...(
5 drey1912
 
16.09.19
19:11
(1) Спасибо, эту часть я давно сделал)
6 drey1912
 
16.09.19
19:14
(3) Затупил, а КомандаСистемы() под линухом тоже работает?
7 Скиурус
 
16.09.19
19:20
(6) Конечно
8 drey1912
 
16.09.19
19:36
(7) И действительно, ушел экспериментировать, спасибо!
9 drey1912
 
17.09.19
15:05
В итоге воспользовался ЗапуститьПриложение() т.к. КомандаСистемы() не работает НаСервере.
10 drey1912
 
17.09.19
15:17
openssl dgst -passin pass:пароль -sign путь_к_pem_файлу -out 'путь_к_подписанному файлу/TestSig.txt' -md5 'путь_к_файлу_с_текстом_зпроса/TestReq.txt'

1. для подписи понадобится пароль, задается после dgst.
2. Путь к фалу .pem
3. путь к подписанному файлу, тут тоже всё ясно, куда укажите там и создаст.
4. путь к файлу с текстом запроса: создаем временный файл, пишем в него текст запроса, указываем путь к нему в команде. Удаляем временный файл(не забываем))
5. Если в пути есть директории с пробелом допустим "Рабочий стол", то такой путь целиком нужно брать в одинарные кавычки!
11 drey1912
 
19.09.19
14:25
P.P.S. Если после подписания файла и кодировки его в base64 он не проходит валидацию подписи, то проверьте не затесались ли в файл(с запросом, который подписывали) символы: \r\n или BOM. Почистите файл от них перед подписанием)
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.