Имя: Пароль:
1C
1С v8
HTTP запрос Post и подпись
0 Aradel3d
 
15.06.18
09:00
Привет!
Есть защищенное HTTP соединение, в котором я прописываю СертификатКлиентаФайл (.pem) и (.key) который подставляю в качестве пароля, а также СертификатыУдостоверяющихЦентровФайл (тоже .pem). Все три сертификата переданы нашим партнером. Но как выяснилось, отправляемый POST запрос, нужно еще подписывать "private_key.xml сконвертированным в pem". В pem я сконвертировал, а вот как дальше не соображу. Подскажите пожалуйста...?
1 Aradel3d
 
15.06.18
09:04
Может речь о МенеджерКриптографии и подписывать надо строку которую я передаю в запросе?
2 Cyberhawk
 
15.06.18
09:06
ССЛ = Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаФайл(ПутьККлиентскомуСертификату, ПарольККлиентскомуСертификату));
3 Cyberhawk
 
15.06.18
09:06
И указываешь его в конструкторе ХТТП-соединения
4 Cyberhawk
 
15.06.18
09:08
Никакого понятия "подписать запрос" в объектной модели 1С нет.
Возможно, тебе нужно добавить в него какой-нибудь заголовок, но это уже исключительно прикладным АПИ поставщика сервиса определяется.
5 Aradel3d
 
15.06.18
09:12
(2) SSL = Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаФайл("C:/.../client.pem","C:/.../client.key"),Новый СертификатыУдостоверяющихЦентровФайл("C:/.../cacert.pem"));

Это уже сделано. Но ТП партнера пишет что "Запрос нужно подписать ключем private_key" т.е. это четвертый файл который они передали нам.

Получается 1с так не умеет? Я кстати попробовал МенеджерКриптографии, вылетает с ошибкой, что подписывать можно только файлы. Но при этом в HTTP запросы мне нужно в тело передавать строку. Получается МенеджерКриптографии отпадает...
6 Cyberhawk
 
15.06.18
09:34
"ТП партнера пишет что "Запрос нужно подписать ключем private_key" т.е. это четвертый файл который они передали нам" // У них и спрашивай, что это означает.
Для начала через какую-нибудь стороннюю проверялку добейся, чтоб работал с твоими сертификатами
7 Cyberhawk
 
15.06.18
09:35
И твой код это дичь какая-то, у тебя пароль это путь к файлу key что ли? Лол
8 Aradel3d
 
15.06.18
09:37
(7) )) сейчас тоже заметил, заменил на содержимое .key - не прокатило...
9 Cyberhawk
 
15.06.18
09:42
Ты узнай у ТП, пусть выдадут тебе сервис для теста, который не требует "подписывать запрос"
10 Cyberhawk
 
15.06.18
09:43
Но который работает через ХТТПС, с клиентским сертификатом и паролем от него
11 Aradel3d
 
15.06.18
09:45
(10) Верно. Как думаешь, пароль в виде содержимого .pem это ок? А то есть сомнения. По хорошему первым этапом тестов нужно чтоб от нас любые сертификаты принимались, далее понять работает ли клиентский сертификат и его пароль KEY и последний этап попытки завести с signature в заголовке например, на мой взгляд.
12 Aradel3d
 
15.06.18
09:46
(11) * пароль в виде содержимого .key файла
13 Cyberhawk
 
15.06.18
09:47
"пароль в виде содержимого .pem это ок?" // Может key? Тебе виднее, где там твой присланный пароль от этого сертификата.
Через браузер-то работает? Он тоже умеет запрашивать файл сертификата и показывает окошко для ввода пароля.
14 dezss
 
15.06.18
09:54
(8) а ты этот файл хоть открывал?
смотрел, что в нем?
15 Aradel3d
 
15.06.18
10:03
(14) конечно, когда я увидел что пароль это жестко строка, открыл файл, взял данные между -----BEGIN PRIVATE KEY----- и -----END PRIVATE KEY----- и перенес в качестве строки в поле для пароля.

(13) нет, ничего не открывает, но ТП говорит, что "Это ок". Сейчас находимся на этапе ожидания отключения проверок клиентских сертификатов. Держу в курсе))
16 Cyberhawk
 
15.06.18
10:06
(15) "взял данные между -----BEGIN PRIVATE KEY----- и -----END PRIVATE KEY----- и перенес в качестве строки в поле для пароля" // Нет, это не пароль, это скорее всего двоичные данные клиентского сертификата
17 Aradel3d
 
15.06.18
10:09
(16) client.crt, client.key - Клиентский сертификат и его секретная часть сгенерированная на основе client_ca.crt (пароль 1234) вот что пишут php-шники из ТП. Тогда вопрос, как подцепить "секретную часть" в 1С?
18 Cyberhawk
 
15.06.18
10:09
Ты еще огласи платформу, а то ХТТПС в веб-/хттп-сервисах с сертификатами работает только на 8.3.9+ (режим совместимости неважен), на более ранних будешь ловить геморрой в виде непонятных ошибок, над которыми можно долго зависать и геморроиться безконечно
19 Aradel3d
 
15.06.18
10:10
*client.crt был сконвертирован в .pem. Платформа 8.3.10.2561
20 Cyberhawk
 
15.06.18
10:12
Рекомендую (на твоем месте) почитать чего-нибудь в гугле, чтобы понимать, чего там и как взаимодействует
21 Aradel3d
 
15.06.18
10:13
(20) я параллельно это делаю:)
22 dezss
 
15.06.18
10:15
(17) ну вот...при генерации ты пароль какой-то вводил для доступа к ключу, его пихай во второй параметр Новый СертификатКлиентаФайл(Путь,Пароль).
А может это волшебное "1234" и есть пароль.
23 Cyberhawk
 
15.06.18
10:15
Скорее всего твои ребятки на той стороне не о "подписи запроса" толкуют, а о подписи передаваемых в этом запросе данных
24 Aradel3d
 
15.06.18
10:16
(22) нет, увы, я все попробовал
25 Aradel3d
 
15.06.18
10:16
(23) данные строка json
26 Cyberhawk
 
15.06.18
10:17
(25) Это неважно, в этой строке и будет текстовое представление зашифрованных тем твоим четвертым ключом данных. Я так думаю.
27 Cyberhawk
 
15.06.18
10:18
Обычно у нормальных ребят (и сам так всегда делаю) есть операция веб-/хттп-сервиса "Hello" без всяких параметров, которая возвращает ответ. Это дает понимание, что ХТТПС-связь (на уровне клиентского сертификата и его пароля) установлена
28 Cyberhawk
 
15.06.18
10:19
Если ХТТПС (ССЛ) соединение установлено, то никакой ХТТП-запрос (ПОСТ там, ГЕТ и т.д.) "подписать" отдельно нельзя. Так что (6) и сношай мозг им.
29 Aradel3d
 
15.06.18
10:21
(27) у этих ребят есть "Hello" но прикол в том, что оно возвращается даже без сертификатов)))
30 Cyberhawk
 
15.06.18
10:50
Ну может это не прикол, а так и задумано.
Возможно эти все твои сертификаты и не нужны для ХТТПС-соединения? А нужны для подписи самих передаваемых данных?
31 Cyberhawk
 
15.06.18
10:51
Тебе явно надо с ними "по понятиям" поговорить (в прямом смысле)
32 Aradel3d
 
15.06.18
11:15
(31) Выяснилось, что под подписью запроса они подразумевали именно x-signature в заголовке запроса. С этим разобрались, но прикол в том, что проверку сертификатов при соединении ssl они отрубить не могут. Запросил у них какую-нибудь проверялку сертификатов на php или еще что-то в этом духе, чтоб понять соединение работает с ними или нет, может и не в 1с дело...
33 Cyberhawk
 
15.06.18
11:49
"проверку сертификатов при соединении ssl они отрубить не могут" // Ну так это и не нужно. Браузером прекрасно проверяется.
34 Aradel3d
 
15.06.18
14:23
Дело было в Private key. К client.pem шел client.key который нужен, чтоб воспользоваться клиентским сертификатом. Но в 1С его подцепить не удалось. Поэтому был запрошен сертификат без ключа client.pfx и он заработал. При этом он защищен паролем (тем самым "1234").

Новый СертификатКлиентаФайл("C:/.../client.pfx","1234")

Вот так вот все здорово закончилось.
35 Cyberhawk
 
15.06.18
14:46
"был запрошен сертификат без ключа client.pfx и он заработал" // Ну это сертификат с паролем, ага. Но только ты и сам его по идее мог сделать, странно что тебя не послали
36 Aradel3d
 
15.06.18
14:50
1с-ники и php-шники, друзба!
37 Cyberhawk
 
15.06.18
14:58
Ну да. Ни те, ни другие не программисты )
38 Джон
 
15.06.18
15:21
Коллеги! Всем привет! Крайне редко здесь оказываюсь , хотя учетка давно. Сегодня методом поиска вышел на эту ветку и прямо в цель. Аналогичная задача - интеграция приложения 1С для получения данных по чекам. Не удивлюсь,  что работаем через одного поставщика. Написал запрос POST, разобрался с подписью в заголовке, хотя в итоге оказывается нужно для каждого запроса формировать новую подпись. А вот коннект был неудачен из-за вот этих самых файлов с ключами. Спасибо за разбор. Буду держать в курсе с подписью, мало ли получится. Прошу вас держите в курсе событий если не сложно.
39 Джон
 
15.06.18
15:29
Подскажите  при определении переменной вот так прописываю

ssl1 = Новый ЗащищенноеСоединениеOpenSSL(
            Новый СертификатКлиентаФайл("D:\!_ФЛ\!_Отчеты и обработки\2 Обработки\ОбменС_ОФД\File_for_test\client.pfx",1234),Новый СертификатыУдостоверяющихЦентровФайл("D:\!_ФЛ\!_Отчеты и обработки\2 Обработки\ОбменС_ОФД\File_for_test\carcert.pem"));

у меня на этой строке через попытку исключение , то есть дальше движения нет

Чего не вижу
40 Cyberhawk
 
15.06.18
15:37
СП в помощь, типы параметров
41 Aradel3d
 
15.06.18
15:56
(39) Пароль в кавычках! "1234"
Кстати покажите как Вы реализовали X-Signature в заголовке?
42 Джон
 
15.06.18
16:10
соединение по SSl прошло только так:
    ssl1 = Новый ЗащищенноеСоединениеOpenSSL(
            Новый СертификатКлиентаФайл("D:\!_ФЛ\!_Отчеты и обработки\2 Обработки\ОбменС_ОФД\File_for_test\client.pfx","1234"),Неопределено);
            то есть без указания  доверяющего центра, и если эти самые все сертификаты инсталлировать в ОС , то можно применять так:

ssl1 = Новый ЗащищенноеСоединениеOpenSSL(
          Новый СертификатКлиентаWindows(СпособВыбораСертификатаWindows.Авто),
            Новый СертификатыУдостоверяющихЦентровWindows());

А теперь к заголовку :
ЗаголовокЗапроса.Вставить("X-Signature", BASE64Значение(та сама строка) которая сконвертирована из файла private_key.xml через https://superdry.apphb.com/tools/online-rsa-key-converter Это так для пробы, но не прокатило - при передаче запроса ошибка,  да и это был бы просто вариант для одного запроса, а надо вот через этот самы файл-ключ генерить подпись для каждого запроса
43 Aradel3d
 
15.06.18
16:16
(42) Должно быть что-то типа:

МенеджерКриптографии = Новый МенеджерКриптографии("Microsoft Base Cryptographic Provider v1.0", "", 1);
    МенеджерКриптографии.АлгоритмХеширования = "SHA-256";
    Signature = Base64Строка(МенеджерКриптографии.Зашифровать(СтрокаJSON,Новый СертификатКриптографии("C:/.../private_key.pem")));

На мой взгляд. Но строка
МенеджерКриптографии.АлгоритмХеширования = "SHA-256";

дает ошибку "Неизвестный алгоритм криптографии."

А если не указывать алгоритм хеширования, то валится на Зашифровать, с ошибкой:

"Ошибка при создании контекста сертификата."
44 Джон
 
15.06.18
16:23
Да, тоже к этому подошел, и опять в сторону ушел,  а есть вариант запуска скрипта , то есть чтение файла с ключом для подписи , это как вопрос?Или такой вариант вообще  и близко не подходит

Криптография  - это явно ближе
45 Aradel3d
 
15.06.18
16:33
Если у меня не выйдет с менеджером криптографии я буду ставить OpenSSL и командной строкой шифровать/подписывать текстовый файл с джейсоном, затем читать его и совать в Х-Сигнатуру.
46 Aradel3d
 
15.06.18
16:36
Проблема 1: какой модуль шифрования указать в Менеджере.
"Microsoft Base Cryptographic Provider v1.0"
и
"Microsoft Enhanced RSA and AES Cryptographic Provider"
выдают ошибку "Неизвестный алгоритм криптографии." на "SHA-256". Я даже не знаю правильно с - или без... чисто по скудной инфе на форумах.

Проблема 2: почему private_key.pem дает ошибку "Ошибка при создании контекста сертификата."

Предположу, что потому что сертификат использует один модуль криптографии, а менеджер в 1С другой.
47 Джон
 
15.06.18
16:46
При передаче данных запроса передаешь строку JSON  а не файл, плюс добавляешь заголовок,  а значит речь не идет о шифровке в целом всего файла,

Возможно это выполняется через Хеширование данных, где

Хеш = Новый  ХешированиеДанных(ХешФункция.SHA256);
      Хеш.ДобавитьФайл(ФайлСКлючом);

а затем при обработке строки еще плюсом добавляется строка через ХЕШ,  и уже итоговая  через кодировк BASE64(Строка) в виде подписи?
48 Aradel3d
 
15.06.18
16:49
(47) Из ХешированиеДанных(ХешФункция.SHA256);  ты получишь только сумму, а зачем тебе сумма?

ТП прислала консольную строку OpenSSL:

openssl dgst -sha256 data.txt > hash
openssl rsautl -sign -inkey privatekey.pem -keyform PEM -in hash >signature

Т.е. они загоняют именно файл, а потом видимо из него дергают содержимое, в своем php. И если Менеджер криптографии не взлетит, надо будет воспроизводить их действия...
49 Джон
 
18.06.18
10:34
Если какие-либо хорошие вести с полей. Уже полная путаница- какой вариант применять, одно ясно судя по описаниям с инета - все скудно и методом ошибок и проб, удалось победить АлгоритмХеширования,  а вот АлгоримПодписи возможно тоже нужно использовать