подписание ЭЦП в xml-файле на Сервере. проблема с кодировкой

1. user1769167 22.11.22 15:06 Сейчас в теме
Всем добрый день! Уважаемые форумчане, поделитесь опытом, может кто-то сталкивался с такой проблемой.

В нашей программе (нетиповая конфигурация, 1С:Предприятие 8.3 (8.3.17.1851)) планируется интеграция с программой соц защиты через СМЭВ-3. И при передаче xml-данных требуется подписывать блок xml по заданному тегу ЭЦ подписью. Криптопровайдер установлен на сервере линукс, там же установлен сертификат. За основу подписания взяла функцию из типовой БГУ "ПодписатьДанныеПоФорматуГИСГМП20НаСервере"

Функция ПодписатьДанныеПоФорматуГИСГМП20НаСервере(Участник,СодержимоеФайла,ТекстОшибки,Знач ИмяУзлаПодписиОВ="") Экспорт
	
	//Имя узла подписи СП может меняться - зависит от вида запроса, иногда может отсутствовать.
	
	//Внимание! 
	//Требования к формированию подписи для тега:
	//все используемые в данном теге и нижестоящих тегах пространства имен
	//должны быть объявлены в данном теге или нижестоящих.
	//При подписи не корневого узла, НЕДОПУСТИМО, чтобы в подписываемом узле использовались пространства имен,
	//объявленные выше.
	
	ШаблонПодписиОВ = "%ПодписьОВ%";
	
	НастройкиПодисиУчастников = ПолучитьНастройкиПодписиУчастников20(Участник);
	
	Попытка
		КомпонентаПодписи = СоздатьОбъектДляПодписиXML_xades();
		Если КомпонентаПодписи = Неопределено Тогда
			ТекстОшибки = НСтр("ru='Не удалось создать компоненту для формирования электронной подписи.'");
			
			Возврат "Ошибка: " + ТекстОшибки;
		КонецЕсли;
		//В версии 2.2.1.0 добавлено свойство СообщатьОбОшибке Булево и ТекстОшибки Строка
		КомпонентаПодписи.СообщатьОбОшибке = Ложь; //Если ложь, то компонента сама не будет выдавать сообщения об ошибке.
				
	Исключение
		ТекстОшибки = НСтр("ru='Не удалось создать компоненту для формирования электронной подписи.
		|%1'");
		ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибки,ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
		
		Возврат "Ошибка: " + ТекстОшибки;
	КонецПопытки;
		
		
		ТекущийУчастник = Участник;
		
		НастройкиУчастника = НастройкиПодисиУчастников[ТекущийУчастник];		
		
		СертификатНачисления = НастройкиУчастника.СертификатЭПНачислений;
		ДанныеСертификатаСущности = НастройкиУчастника.ДанныеСертификатаНачислений;  		
		
		ПозицияНачалаФайла = 1;
		Если СтрНачинаетсяС(СодержимоеФайла,"<?")  Тогда
			ПозицияНачалаФайла = СтрНайти(СодержимоеФайла,"?>")+2;
			СодержимоеФайла = СокрЛП(Сред(СодержимоеФайла,ПозицияНачалаФайла));
		КонецЕсли; 		
			
		Если ЗначениеЗаполнено(ИмяУзлаПодписиОВ) Тогда		
			
			Отправитель = НастройкиУчастника.Отправитель;
	
			НастройкиОтправителя = НастройкиПодисиУчастников[Отправитель];
			ДанныеСертификатаЗаголовка= НастройкиОтправителя.ДанныеСертификатаСообщения;		
							
			Попытка
				//метод ПодписатьXMLDSignСМЭВ3 - регистрозависимый
				//КомпонентаПодписи.SignatureID = "_" + Строка(Новый УникальныйИдентификатор());
				КомпонентаПодписи.ПодписатьXMLDSignСМЭВ3(
					СодержимоеФайла,
					ИмяУзлаПодписиОВ,
					ДанныеСертификатаЗаголовка,
					Истина,
					Истина,
					НастройкиОтправителя.ПарольЭПСообщения);
					
				Подпись = КомпонентаПодписи.Подпись;
				
				//ЧтениеСодержимоеФайла = СтрЗаменить(ЧтениеСодержимоеФайла, ШаблонПодписиОВ,Подпись);
				
			Исключение
								
				ТекстОшибки = НСтр("ru='При формировании подписи ОВ возникла ошибка. Не удалось подписать %1.
						|%2
						|Описание ошибки внешней компоненты: %3'");
				ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибки,ИмяУзлаПодписиОВ,ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),КомпонентаПодписи.ТекстОшибки);
					
				Возврат "Ошибка: " + ТекстОшибки;					
			КонецПопытки;
			
			Подписано = Истина;		
		КонецЕсли; 		
	
	
	возврат  Подпись;
КонецФункции
Показать


Если подписываю данные xml, где нет русских букв, то подпись работает (см вложение). А если задать значение какого-либо атрибута в xml русскими буквами, то выдает ошибку, и в тексте ошибки этот атрибут идет нечитаемыми символами (см вложение).

Понимаю что дело в кодировке, но где именно ее требуется настроить?

(при использовании аналогичной функции подписи на клиенте такой проблемы нет).

Благодарю за любые комментарии/пояснения!
Прикрепленные файлы:
Ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. booksfill 22.11.22 18:08 Сейчас в теме
Ну, раз за любые ... :)

Попробуйте так (просто как направление мысли):

Возьмите свой файл и попробуйте открыть его в каком-нибудь редакторе, позволяющем менять кодировку.
Вероятно, уверение, что строка в utf-8 не соответствует действительности. А на самом деле там, например, Windows -1251 или вообще ISO-8859-1.

Еще вариант - возьмите из ошибки текст с крякозябрами и попробуйте погонять его через on-line перекодировщик, может тоже наведет на какие-то мысли.

Ну и проверьте кодировки по-умолчанию на сервере и на клиенте, а также есть ли на сервере вообще кириллица - как вариант, компонента фигачит все во временный файл (или в поток) причем не в той кодировке.

И еще, в подобных случаях лучше прикладывать файлы, а не картинки, правда, понятия не имею, можно ли это здесь сделать
user1769167; +1 Ответить
3. user1769167 23.11.22 10:07 Сейчас в теме
(2)спасибо огромное!!! попробую проверить.
4. YA_787636694 20.01.23 17:32 Сейчас в теме
(3)Доброго времени суток, ваша проблема как то решилась?
5. user1769167 21.01.23 20:06 Сейчас в теме
(4) здравствуйте! Нет, не решилась. Разбираемся. Кодировки на сервере проверили, по умолчанию utf8. Не знаем пока в чем дело.. ((((
6. YA_787636694 21.01.23 20:35 Сейчас в теме
(5) у нас возникла та же проблема, тоже пока безрезультатно бьёмся.
Возможно вас натолкнет это на какие-то мысли - Первая подпись после запуска сервера (а если быть точным рабочего процесса, внутри которого храниться подключенная ВК), происходит без возникновения ошибки. Поэтому убийство рабочего процесса снимает ошибку, но ровно на одну подпись.
Мы даже попробовали подключать ВК в изолированном режиме (доступно в платформе 8.3.21) и после каждой подписи убивать суб-процесс в котором существует ВК. Это работает, но выглядит крайне стрёмно и неправильно.
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)