Получение Токена ЧестныйЗнак

1. M_A_D 184 26.07.23 09:04 Сейчас в теме
Пытаюсь получить токен в 1С для отправки запросов, для получения статусов КИЗ в ЧЗ.

&НаСервере
Процедура ПолучитьТокенНаСервере()
	
	Соединение = Новый HTTPСоединение(Сервер,443,,,,,Новый ЗащищенноеСоединениеOpenSSL);
	Заголовки = Новый Соответствие;
	Заголовки.Вставить("Content-Type", "application/json");
	Заголовки.Вставить("Accept", "application/json");
	HTTPЗапрос = Новый HTTPЗапрос("/api/v1/auth",Заголовки);
	ЗаписьJOIN = Новый ЗаписьJSON;
	ЗаписьJOIN.УстановитьСтроку();
	ДанныеДляЗапроса = Новый Структура;
	ДанныеДляЗапроса.Вставить("client_id",client_id);
	ДанныеДляЗапроса.Вставить("client_secret",client_secret);
	ДанныеДляЗапроса.Вставить("user_id",user_id);
	ДанныеДляЗапроса.Вставить("auth_type",auth_type);	
	ЗаписатьJSON(ЗаписьJOIN,ДанныеДляЗапроса);
	СтрокаДляЗапроса = ЗаписьJOIN.Закрыть();
	
	HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаДляЗапроса,КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
	Ответ = Соединение.ВызватьHTTPМетод("POST",HTTPЗапрос);
	ЧтениеJSON = Новый ЧтениеJSON;
	ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
	Структура = ПрочитатьJSON(ЧтениеJSON, Ложь);
	УИД = Структура.code;
	
	// Подписание данных для получения токена
	ДанныеДляПолученияТокена = ПодписатьТекст(ЗашифроватьBase64(УИД,"UTF-8"),СертификатДляОбмена,Истина);
	//ДанныеДляПолученияТокена = СтрЗаменить(ДанныеДляПолученияТокена,,"");
	ЗаписатьВЖурнал("Подписано сертификатом " + СертификатДляОбмена + Символы.ПС + ДанныеДляПолученияТокена);
	
	// Получение токена с использованием подписанных данных
	Соединение = Новый HTTPСоединение(Сервер,443,,,,,Новый ЗащищенноеСоединениеOpenSSL);
	Заголовки = Новый Соответствие;
	Заголовки.Вставить("Content-Type", "application/json");
	Заголовки.Вставить("Accept", "application/json");
	HTTPЗапрос = Новый HTTPЗапрос("api/v1/token",Заголовки);
	ЗаписьJOIN = Новый ЗаписьJSON;
	ЗаписьJOIN.УстановитьСтроку();
	ДанныеДляЗапроса = Новый Структура;
	ДанныеДляЗапроса.Вставить("code",УИД);
	ДанныеДляЗапроса.Вставить("signature",ДанныеДляПолученияТокена);	
	ЗаписатьJSON(ЗаписьJOIN,ДанныеДляЗапроса);
	СтрокаДляЗапроса = ЗаписьJOIN.Закрыть();
	
	HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаДляЗапроса,КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
	Ответ = Соединение.ОтправитьДляОбработки(HTTPЗапрос);
	ЧтениеJSON = Новый ЧтениеJSON;
	ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
	Токен = ПрочитатьJSON(ЧтениеJSON, Ложь).token;
		
КонецПроцедуры
Показать


Валится на выполнении вот этой функции в строке:

oSignedData = Новый COMОбъект("CAdESCOM.CadesSignedData");


Функция ПодписатьТекст(ТекстДляПодписи, sThumbprint, bDetached)
	
	CADESCOM_BASE64_TO_BINARY = 1; // Входные данные пришли в Base64
	CADESCOM_CADES_TYPE = 1; // Тип усовершенствованной подписи
	CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME = 0; // Атрибут штампа времени подписи
	oSigner = Новый COMОбъект("CAdESCOM.CPSigner");
	// Объект, задающий параметры создания и содержащий информацию об усовершенствованной подписи.
	oSigner.Certificate = ПолучитьСертификатПоОтпечатку(sThumbprint);
	oSigningTimeAttr = Новый COMОбъект("CAdESCOM.CPAttribute");
	oSigningTimeAttr.Name = CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME;
	oSigningTimeAttr.Value = ТекущаяДата();
	oSigner.AuthenticatedAttributes2.Add(oSigningTimeAttr);
	ТекстДляПодписи = СокрЛП(ТекстДляПодписи);
	oSignedData = Новый COMОбъект("CAdESCOM.CadesSignedData");
	// Объект CadesSignedData предоставляет свойства и методы для работы с усовершенствованной подписью.
	oSignedData.ContentEncoding = CADESCOM_BASE64_TO_BINARY;
	oSignedData.Content = СокрЛП(ТекстДляПодписи);
	EncodingType = 0;
	sSignedMessage = oSignedData.SignCades(oSigner, CADESCOM_CADES_TYPE,
	bDetached, EncodingType);
	// Метод добавляет к сообщению усовершенствованную подпись.
	Возврат sSignedMessage; // Подпись в формате Base64
		
КонецФункции
Показать


Вводные:
1. Работает на файловой БД.
2. Ошибка появляется при тестировании на серверной БД.

Первый опыт работы с подписанием из 1С, может есть опытные ребята, которые сталкивались с подобной задачей.

Текст Ошибки:
Произошла исключительная ситуация (CAdESCOM.CadesSignedData.1): Недопустимый дескриптор окна.
{ВнешняяОбработка.ГИСМТ.Форма.Форма.Форма(130)}: sSignedMessage = oSignedData.SignCades(oSigner, CADESCOM_CADES_TYPE,
{ВнешняяОбработка.ГИСМТ.Форма.Форма.Форма(64)}: ДанныеДляПолученияТокена = ПодписатьТекст(ЗашифроватьBase64(УИД,"UTF-8"),СертификатДляОбмена,Истина);
{ВнешняяОбработка.ГИСМТ.Форма.Форма.Форма(35)}: ПолучитьТокенНаСервере();

по причине:
Произошла исключительная ситуация (CAdESCOM.CadesSignedData.1): Недопустимый дескриптор окна.
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. user5300 1021 26.07.23 09:47 Сейчас в теме
(1)
&НаСервере
Процедура ПолучитьТокенНаСервере()


Получение токена происходит на сервере, соответственно Крипто про (Драйвер) должен быть установлен на сервере и сертификат ЭЦП там же
3. M_A_D 184 26.07.23 09:47 Сейчас в теме
(2)
Тачка которая является сервером, на ней же и база развернута у клиента, все подписи там и сам КриптоПро, как следствие там же...
4. user1852218 26.07.23 10:03 Сейчас в теме
(3)
все подписи там
Набор подписей (сертификатов) у каждого пользователя свой, в данном случае необходимо, чтобы подпись была установлена для пользователя USR1CV8 (или как он там у вас называется), от имени которого запускается служба сервера 1С.

Это косвенно подтверждается тем, что "Работает на файловой БД" - то есть, код правильный, но при этом он исполняется от имени "обычного" пользователя.
5. M_A_D 184 26.07.23 13:54 Сейчас в теме
(4) как поступить, если вход осуществляется с системной учётной записью?
Служба работает под этой учётной)))
9. user1852218 26.07.23 14:46 Сейчас в теме
(5)
как поступить, если вход осуществляется с системной учётной записью?
Очевидно: создать соответствующую учетку и запускать 1С под ней.

Хотя бы на время, для проверки.
6. noprogrammer 239 26.07.23 14:14 Сейчас в теме
(1) На сервере компонента зарегистрирована?
7. M_A_D 184 26.07.23 14:17 Сейчас в теме
(6) вы имеете ввиду COM-компоненту?
Если, да, то не знаю, сейчас проверим
8. M_A_D 184 26.07.23 14:19 Сейчас в теме
(6)м, даже проверять не нужно, небыло бы компоненты, валилось бы на верном вызове комОбъекта)
Оставьте свое сообщение

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