ВыполнитьНаСторонеСервера (БСП)

Автор: 1С
ОбщийМодуль.ЭлектроннаяПодписьСлужебныйВызовСервера
БСП

Выполнить на стороне сервера. Только для внутреннего использования.

// Только для внутреннего использования.
Функция ВыполнитьНаСторонеСервера(Знач Параметры, АдресРезультата, ОперацияНачалась, ОшибкаНаСервере) Экспорт
	
	МенеджерКриптографии = ЭлектроннаяПодписьСлужебный.МенеджерКриптографии(Параметры.Операция,
		Ложь, ОшибкаНаСервере, Параметры.СертификатПрограмма);
	
	Если МенеджерКриптографии = Неопределено Тогда
		Возврат Ложь;
	КонецЕсли;
	
	// Если личный сертификат шифрования не используется, тогда его не нужно искать.
	Если Параметры.Операция <> "Шифрование"
	 Или ЗначениеЗаполнено(Параметры.СертификатОтпечаток) Тогда
		
		СертификатКриптографии = ЭлектроннаяПодписьСлужебный.ПолучитьСертификатПоОтпечатку(
			Параметры.СертификатОтпечаток, Истина, Ложь, Параметры.СертификатПрограмма, ОшибкаНаСервере);
		
		Если СертификатКриптографии = Неопределено Тогда
			Возврат Ложь;
		КонецЕсли;
	КонецЕсли;
	
	Попытка
		Данные = ПолучитьИзВременногоХранилища(Параметры.ЭлементДанныхДляСервера.Данные);
	Исключение
		ИнформацияОбОшибке = ИнформацияОбОшибке();
		ОшибкаНаСервере.Вставить("ОписаниеОшибки",
			ЭлектроннаяПодписьСлужебныйКлиентСервер.ЗаголовокОшибкиПолученияДанных(Параметры.Операция)
			+ Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
		Возврат Ложь;
	КонецПопытки;
	
	ЭтоXMLDSig = (ТипЗнч(Данные) = Тип("Структура")
	            И Данные.Свойство("ПараметрыXMLDSig"));
	
	Если ЭтоXMLDSig Тогда
		
		Если Параметры.Операция <> "Подписание" Тогда
			ОшибкаНаСервере.Вставить("ОписаниеОшибки",
				ЭлектроннаяПодписьСлужебныйКлиентСервер.ЗаголовокОшибкиПолученияДанных(Параметры.Операция)
				+ Символы.ПС + НСтр("ru = 'Внешняя компонента XMLDSig может использоваться только для подписания.'"));
			Возврат Ложь;
		КонецЕсли;
		
		МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = Параметры.ЗначениеПароля;
		Попытка
			ДвоичныеДанныеРезультата = ЭлектроннаяПодписьСлужебный.Подписать(
				Данные.КонвертSOAP,
				Данные.ПараметрыXMLDSig,
				СертификатКриптографии,
				МенеджерКриптографии);
		Исключение
			ИнформацияОбОшибке = ИнформацияОбОшибке();
		КонецПопытки;
		
	Иначе
		
		ОписаниеОшибки = "";
		Если Параметры.Операция = "Подписание" Тогда
			МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = Параметры.ЗначениеПароля;
			Попытка
				ДвоичныеДанныеРезультата = МенеджерКриптографии.Подписать(Данные, СертификатКриптографии);
				ЭлектроннаяПодписьСлужебныйКлиентСервер.ПустыеДанныеПодписи(ДвоичныеДанныеРезультата, ОписаниеОшибки);
			Исключение
				ИнформацияОбОшибке = ИнформацияОбОшибке();
			КонецПопытки;
		ИначеЕсли Параметры.Операция = "Шифрование" Тогда
			Сертификаты = СертификатыКриптографии(Параметры.АдресСертификатов);
			Попытка
				ДвоичныеДанныеРезультата = МенеджерКриптографии.Зашифровать(Данные, Сертификаты);
				ЭлектроннаяПодписьСлужебныйКлиентСервер.ПустыеЗашифрованныеДанные(ДвоичныеДанныеРезультата, ОписаниеОшибки);
			Исключение
				ИнформацияОбОшибке = ИнформацияОбОшибке();
			КонецПопытки;
		Иначе // Расшифровка.
			МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = Параметры.ЗначениеПароля;
			Попытка
				ДвоичныеДанныеРезультата = МенеджерКриптографии.Расшифровать(Данные);
			Исключение
				ИнформацияОбОшибке = ИнформацияОбОшибке();
			КонецПопытки;
		КонецЕсли;
	
	КонецЕсли;
	
	Если ИнформацияОбОшибке <> Неопределено Тогда
		ОшибкаНаСервере.Вставить("ОписаниеОшибки", КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
		ОшибкаНаСервере.Вставить("Инструкция", Истина);
		Возврат Ложь;
	КонецЕсли;
	
	Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда
		ОшибкаНаСервере.Вставить("ОписаниеОшибки", ОписаниеОшибки);
		Возврат Ложь;
	КонецЕсли;
	
	ОперацияНачалась = Истина;
	
	Если Параметры.Операция = "Подписание" Тогда
		СвойстваСертификата = ЭлектроннаяПодпись.СвойстваСертификата(СертификатКриптографии);
		СвойстваСертификата.Вставить("ДвоичныеДанные", СертификатКриптографии.Выгрузить());
		
		СвойстваПодписи = ЭлектроннаяПодписьСлужебныйКлиентСервер.СвойстваПодписи(ДвоичныеДанныеРезультата,
			СвойстваСертификата, Параметры.Комментарий, Пользователи.АвторизованныйПользователь());
		
		Если Параметры.СертификатВерен <> Неопределено Тогда
			СвойстваПодписи.ДатаПодписи = ТекущаяДатаСеанса();
			СвойстваПодписи.ДатаПроверкиПодписи = СвойстваПодписи.ДатаПодписи;
			СвойстваПодписи.ПодписьВерна = Параметры.СертификатВерен;
		КонецЕсли;
		
		АдресРезультата = ПоместитьВоВременноеХранилище(СвойстваПодписи, Параметры.ИдентификаторФормы);
		
		Если Параметры.ЭлементДанныхДляСервера.Свойство("Объект") Тогда
			ВерсияОбъекта = Неопределено;
			Параметры.ЭлементДанныхДляСервера.Свойство("ВерсияОбъекта", ВерсияОбъекта);
			ПредставлениеОшибки = ДобавитьПодпись(Параметры.ЭлементДанныхДляСервера.Объект,
				СвойстваПодписи, Параметры.ИдентификаторФормы, ВерсияОбъекта);
			Если ЗначениеЗаполнено(ПредставлениеОшибки) Тогда
				ОшибкаНаСервере.Вставить("ОписаниеОшибки", ПредставлениеОшибки);
				Возврат Ложь;
			КонецЕсли;
		КонецЕсли;
	Иначе
		АдресРезультата = ПоместитьВоВременноеХранилище(ДвоичныеДанныеРезультата, Параметры.ИдентификаторФормы);
	КонецЕсли;
	
	Возврат Истина;
	
КонецФункции

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

Рекомендации

Похожие публикации

ВыполнитьНаСтороне (БСП)

ВыполнитьПодключениеКонечнойТочкиНаСторонеПолучателя (БСП)

ВыполнитьПодключениеКонечнойТочкиНаСторонеОтправителя (БСП)

ВыполнитьНаСторонеПослеПоискаСертификата (БСП)

ВыполнитьНаСторонеПослеВыгрузкиСертификата (БСП)

НастройкиПроксиНаСервере (БСП)

СохранитьНастройкиПроксиНаСервере1СПредприятие (БСП)

ВыполнитьНаСторонеПослеСозданияМенеджераКриптографии (БСП)

ВыполнитьНаСторонеПодготовкаСертификатовПослеИнициализацииСертификата (БСП)

Синтакс-помощник БСП с нейросетевым ассистентом