Получение авторизационного токена Диадок

1. tvalvor 15.10.24 09:09 Сейчас в теме
Добрый день.

Стоит задача, настроить интеграцию с Диадок посредством HTTP-запросов.
Ключ разработчика есть, API оплачен - через компоненту все работает.
При попытке получения авторизационного токена приходит код состояния 400 с ответом "Could not deserialize certificate from the request body".

Менеджер = Новый МенеджерКриптографии("Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider","",75);
	Хранилиище = Менеджер.ПолучитьХранилищеСертификатов(ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты,РасположениеХранилищаСертификатовКриптографии.ДанныеКомпьютера);
	Сертификаты = Хранилиище.ПолучитьВсе();
	
	Сертификат = Сертификаты[0];
	ДД = Сертификат.Выгрузить();
	
	Запрос = Новый Запрос;
	Запрос.Текст = "выбрать ApiClientId как ключ
					|из справочник.автомирпользователидиадок
					|где код = ""!Группа 1""";
	Выборка = Запрос.Выполнить().Выбрать();
	Если Выборка.Следующий() Тогда
		КлючРазработчика = Выборка.Ключ;
	КонецЕсли;
	Запрос = Неопределено;
	
	Соединение = Новый HTTPСоединение("diadoc-api.kontur.ru",,,,,,Новый ЗащищенноеСоединениеOpenSSL());
	Запрос = Новый HTTPЗапрос("/v3/Authenticate?type=certificate");
	Запрос.Заголовки.Вставить("POST /v3/Authenticate?type=certificate HTTP/1.1");
	Запрос.Заголовки.Вставить("Host", "diadoc-api.kontur.ru");
	Запрос.Заголовки.Вставить("Content-Type", "octet-stream");
	Запрос.Заголовки.Вставить("Content-Length", "1252");
	Запрос.Заголовки.Вставить("Connection", "Keep-Alive");
	Запрос.Заголовки.Вставить("Authorization", "DiadocAuth ddauth_api_client_id=" + КлючРазработчика);
	Запрос.УстановитьТелоИзДвоичныхДанных(ДД);
	
	Попытка
		//Ответ = Соединение.ОтправитьДляОбработки(Запрос);
		ФайлРезультата = ПолучитьИмяВременногоФайла();
		Соединение.ОтправитьДляОбработки(Запрос, ФайлРезультата);
		Ответ = Новый ТекстовыйДокумент();
		Ответ.Прочитать(ФайлРезультата, КодировкаТекста.UTF8);
		СтрокаОтвета = Ответ.ПолучитьТекст();
	Исключение
		Сообщить(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
	КонецПопытки;
Показать


Ткните, пожалуйста, что я делаю не так, и как надо сделать, чтобы заработало?
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. user_1880116 15.10.24 09:29 Сейчас в теме
(1)
Ткните
Ну понятно же написано: "Could not deserialize certificate from the request body". " Что в документации по поводу request body написано и что ты туда пихаешь?
3. tvalvor 15.10.24 09:35 Сейчас в теме
(2) Какие двоичные данные я только ни пытался передать в тело запроса - ответ тот же.
В документации только так написано: 400 Bad Request – данные в запросе имеют неверный формат или отсутствуют обязательные параметры.
Тех поддержка диадока попросила у меня файл открытого сертификата, проверила запрос с помощью, вероятно, postman и прислала скрин, что все ок, ответ 200. А дальше, говорят разбирайтесь сами, что вы там в тело запроса передаете.
В общем, на мой вопрос они так и не ответили. На гитхабе тоже тишина. Я уже просто не понимаю, что именно нужно передать и откуда это взять.
4. user_1880116 15.10.24 09:37 Сейчас в теме
(3)
400 Bad Request – данные в запросе имеют неверный формат
В документации на эндпоинт, в который ты сырые двоичные данные суешь, что написано? Слово "deserialize" прямо кричит.
5. tvalvor 15.10.24 09:40 Сейчас в теме
(4) Вы можете написать как это должно выглядеть? Был бы весьма благодарен.
Для меня "deserialize" ни о чем не говорит, сколько ни гуглил - ничего не нашел похожего или внятно разжеванного.
6. user_1880116 15.10.24 09:46 Сейчас в теме
(5)
Вы можете написать
У меня, к сожалению, с Диадоком договор. Я не ищу и разжевываю их документацию, а они не пишут на форум.
7. tvalvor 15.10.24 09:50 Сейчас в теме
(6) Очень жаль. Ждем других...
14. tirkirill 18.06.25 01:59 Сейчас в теме
(1) Немного некропостинг, но вдруг кто столкнулся с таким же:

// Соединяется по сертификату и возвращает токен
//
// Параметры:
//  НастройкаПодключения - см. НовыеНастройкиПодключения
//  ДанныеСертификата - ДвоичныеДанные - Двоичное DER-представление X.509-сертификата пользователя
// 
// Возвращаемое значение:
//  Строка - Токен
//
Функция СоединитьсяНаСервереПоСертификату(НастройкаПодключения, ДанныеСертификата) Экспорт
	
	КлючРазработчика = НастройкаПодключения.APIКлюч;
	
	// Чтобы использовать v3 версию надо потом будет вызывать AuthenticateConfirm
	//АдресРесурса = "/V3/Authenticate?type=certificate";
	АдресРесурса = "/Authenticate?type=certificate";
	АдресСайта = Сервер();
	HTTPЗапрос2 = Новый HTTPЗапрос;
	HTTPЗапрос2.Заголовки.Вставить("POST "+АдресРесурса+" HTTP/1.1");
	HTTPЗапрос2.Заголовки.Вставить("Host", "diadoc-api.kontur.ru");
	HTTPЗапрос2.Заголовки.Вставить("Content-Type", "application/octet-stream");
	HTTPЗапрос2.Заголовки.Вставить("Accept", "application/json");
	HTTPЗапрос2.Заголовки.Вставить("Authorization", "DiadocAuth ddauth_api_client_id="+КлючРазработчика);
	HTTPЗапрос2.АдресРесурса = АдресРесурса;
	
	HTTPЗапрос2.УстановитьТелоИзДвоичныхДанных(ДанныеСертификата);
	
	Соединение = Новый HTTPСоединение(АдресСайта,,,,, 10, Новый ЗащищенноеСоединениеOpenSSL(),Ложь);
	Ответ = Соединение.ОтправитьДляОбработки(HTTPЗапрос2);
	ТелоОтвета = Ответ.ПолучитьТелоКакДвоичныеДанные();
	
	МенеджерКриптографии = Новый МенеджерКриптографии("", "", 80); 
	ТокенСтрокой = Base64Строка(МенеджерКриптографии.Расшифровать(ТелоОтвета, Новый СертификатКриптографии(ДанныеСертификата)));
	ТокенСтрокой = СтрЗаменить(ТокенСтрокой, Символы.ВК, "");
	ТокенСтрокой = СтрЗаменить(ТокенСтрокой, Символы.ПС, "");
	
	Возврат ТокенСтрокой;
	
КонецФункции
Показать


Получал такую же ошибку, когда пытался получать ответ как строку (надо как ДД). Кажется здесь такая же ошибка.
НастройкиПодключения это структура с логинами, паролями и т.д. (в данном случае нужен только API-ключ).
ДанныеСертификата - просто ДД сертификата
8. kuzev 48 15.10.24 09:57 Сейчас в теме
Вы уверены, что корректно получаете сертификат (слепок) из хранилища?
9. tvalvor 15.10.24 10:01 Сейчас в теме
(8) Я первый раз работаю с сертификатами и с HTTP-запросами (ну, так получилось). Я ни в чем не уверен.
Этт способ получения сертификатов выдал мне хоть какие-то данные (во всяком случае данные нужного сертификата).
10. kuzev 48 15.10.24 10:12 Сейчас в теме
Смущает, что Вы пользуетесь старым ГОСТ. КриптоПро какой версии?
О работе с ГОСТ Р 34.10-2001 в КриптоПро CSP 3.9,4.0 и КриптоПро JCP 2.0 в 2019 году
11. tvalvor 15.10.24 10:55 Сейчас в теме
(10) Версия КриптоПро 4.0.9963.
Вы хотите сказать, что дело в "GOST R 34.10-2001"? Это я брал из интернетов, вполне возможно, что и что-то устаревшее.
Попробовал поменять на 34.10-2012, упала ошибка "Ошибка при получении контекста модуля криптографии"
12. kuzev 48 15.10.24 11:19 Сейчас в теме
(11) Рекомендую обновить КриптоПро до версии 5.0.ххххх.
13. tvalvor 30.10.24 08:39 Сейчас в теме
(12) Не помогло. Все равно не получается десериализовать.
Для отправки сообщения требуется регистрация/авторизация

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот