2098 lines
141 KiB
Plaintext
2098 lines
141 KiB
Plaintext
///////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
// Copyright (c) 2019, ООО 1С-Софт
|
||
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
|
||
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
|
||
// Текст лицензии доступен по ссылке:
|
||
// https://creativecommons.org/licenses/by/4.0/legalcode
|
||
///////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
||
#Область СлужебныйПрограммныйИнтерфейс
|
||
|
||
// Добавляет сертификаты к переданному объекту.
|
||
Процедура ДобавитьСертификатыШифрования(ОбъектСсылка, МассивОтпечатков) Экспорт
|
||
УстановитьПривилегированныйРежим(Истина);
|
||
|
||
ПорядковыйНомер = 1;
|
||
Для Каждого ОтпечатокСтруктура Из МассивОтпечатков Цикл
|
||
МенеджерЗаписи = РегистрыСведений.СертификатыШифрования.СоздатьМенеджерЗаписи();
|
||
МенеджерЗаписи.ЗашифрованныйОбъект = ОбъектСсылка;
|
||
МенеджерЗаписи.Отпечаток = ОтпечатокСтруктура.Отпечаток;
|
||
МенеджерЗаписи.Представление = ОтпечатокСтруктура.Представление;
|
||
МенеджерЗаписи.Сертификат = Новый ХранилищеЗначения(ОтпечатокСтруктура.Сертификат);
|
||
МенеджерЗаписи.ПорядковыйНомер = ПорядковыйНомер;
|
||
ПорядковыйНомер = ПорядковыйНомер + 1;
|
||
МенеджерЗаписи.Записать();
|
||
КонецЦикла;
|
||
|
||
КонецПроцедуры
|
||
|
||
// Очищает записи о сертификатах шифрования после расшифровка объекта.
|
||
Процедура ОчиститьСертификатыШифрования(ОбъектСсылка) Экспорт
|
||
УстановитьПривилегированныйРежим(Истина);
|
||
|
||
НаборЗаписей = РегистрыСведений.СертификатыШифрования.СоздатьНаборЗаписей();
|
||
НаборЗаписей.Отбор.ЗашифрованныйОбъект.Установить(ОбъектСсылка);
|
||
НаборЗаписей.Записать(Истина);
|
||
|
||
КонецПроцедуры
|
||
|
||
// Только для внутреннего использования.
|
||
Процедура ОформитьСписокПодписей(Форма, ИмяСпискаПодписей) Экспорт
|
||
|
||
Элемент = Форма.УсловноеОформление.Элементы.Добавить();
|
||
|
||
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
|
||
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(ИмяСпискаПодписей);
|
||
|
||
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
|
||
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяСпискаПодписей + ".ПодписьВерна");
|
||
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
|
||
ОтборЭлемента.ПравоеЗначение = Ложь;
|
||
|
||
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЦветОсобогоТекста);
|
||
|
||
КонецПроцедуры
|
||
|
||
// Определяет доступность электронной подписи для объекта (по его типу)
|
||
Функция ДоступнаЭлектроннаяПодпись(ТипОбъекта) Экспорт
|
||
|
||
Возврат ЭлектроннаяПодписьСлужебныйПовтИсп.ТипыВладельцев().Получить(ТипОбъекта) <> Неопределено;
|
||
|
||
КонецФункции
|
||
|
||
// Возвращает адрес сертификата во временном хранилище и его расширение.
|
||
//
|
||
// Параметры:
|
||
// СведенияОЭлектроннойПодписи - Структура - Строка с подписями из массива полученного методом ЭлектроннаяПодпись.УстановленныеПодписи.
|
||
// УникальныйИдентификатор - УникальныйИдентификатор - Идентификатор формы.
|
||
//
|
||
// Возвращаемое значение:
|
||
// Структура -
|
||
// * РасширениеСертификата - Строка - Расширение файла сертификата.
|
||
// * АдресСертификата - Строка - Адрес во временном хранилище, по которому был помещен сертификат.
|
||
//
|
||
Функция ДанныеПоСертификату(СведенияОЭлектроннойПодписи, УникальныйИдентификатор) Экспорт
|
||
|
||
Результат = Новый Структура("РасширениеСертификата, АдресСертификата");
|
||
ДанныеСертификата = СведенияОЭлектроннойПодписи.Сертификат.Получить();
|
||
|
||
Если ТипЗнч(ДанныеСертификата) = Тип("Строка") Тогда
|
||
Результат.РасширениеСертификата = "txt";
|
||
Результат.АдресСертификата = ПоместитьВоВременноеХранилище(
|
||
ДвоичныеДанныеСтроки(ДанныеСертификата), УникальныйИдентификатор);
|
||
Иначе
|
||
Результат.РасширениеСертификата = "cer";
|
||
Результат.АдресСертификата = ПоместитьВоВременноеХранилище(
|
||
ДанныеСертификата, УникальныйИдентификатор);
|
||
КонецЕсли;
|
||
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
// Возвращает признак возможности интерактивного использования электронных подписей и шифрования
|
||
// для текущего пользователя.
|
||
//
|
||
// Возвращаемое значение:
|
||
// Булево - если Истина, то интерактивное использование электронных подписей и шифрование возможно.
|
||
//
|
||
Функция ИспользоватьИнтерактивноеДобавлениеЭлектронныхПодписейИШифрование() Экспорт
|
||
Возврат ПравоДоступа("ИнтерактивноеДобавление", Метаданные.Справочники.СертификатыКлючейЭлектроннойПодписиИШифрования);
|
||
КонецФункции
|
||
|
||
// Из переданных имен файлов выделяются имена файлов данных и имена файлов их подписей.
|
||
// Сопоставление происходит по правилам формирования имени подписи и расширения файла подписи (p7s).
|
||
// Например:
|
||
// Имя файла данных: "example.txt"
|
||
// имя файла подписи: "example-Ivanov Petr.p7s"
|
||
// имя файла подписи: "example-Ivanov Petr (1).p7s".
|
||
//
|
||
// Параметры:
|
||
// ИменаФайлов - Массив - имена файлов типа Строка.
|
||
//
|
||
// Возвращаемое значение:
|
||
// Соответствие - содержит:
|
||
// * Ключ - Строка - имя файла.
|
||
// * Значение - Массив - имена файлов подписей типа Строка.
|
||
//
|
||
Функция ИменаФайловПодписейИменФайловДанных(ИменаФайлов) Экспорт
|
||
|
||
РасширениеДляФайловПодписи = ЭлектроннаяПодпись.ПерсональныеНастройки().РасширениеДляФайловПодписи;
|
||
|
||
Результат = Новый Соответствие;
|
||
|
||
// Разделяем файлы по расширению.
|
||
ИменаФайловДанных = Новый Массив;
|
||
ИменаФайловПодписей = Новый Массив;
|
||
|
||
Для Каждого ИмяФайла Из ИменаФайлов Цикл
|
||
Если СтрЗаканчиваетсяНа(ИмяФайла, РасширениеДляФайловПодписи) Тогда
|
||
ИменаФайловПодписей.Добавить(ИмяФайла);
|
||
Иначе
|
||
ИменаФайловДанных.Добавить(ИмяФайла);
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
|
||
// Отсортируем имена файлов данных по убыванию числа символов в строке.
|
||
|
||
Для ИндексА = 1 По ИменаФайловДанных.Количество() Цикл
|
||
ИндексМАКС = ИндексА; // Считаем что текущий файл имеет самое большое число символов.
|
||
Для ИндексБ = ИндексА+1 По ИменаФайловДанных.Количество() Цикл
|
||
Если СтрДлина(ИменаФайловДанных[ИндексМАКС-1]) > СтрДлина(ИменаФайловДанных[ИндексБ-1]) Тогда
|
||
ИндексМАКС = ИндексБ;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
своп = ИменаФайловДанных[ИндексА-1];
|
||
ИменаФайловДанных[ИндексА-1] = ИменаФайловДанных[ИндексМАКС-1];
|
||
ИменаФайловДанных[ИндексМАКС-1] = своп;
|
||
КонецЦикла;
|
||
|
||
// Поиск соответствий имен файлов.
|
||
Для Каждого ИмяФайлаДанных Из ИменаФайловДанных Цикл
|
||
Результат.Вставить(ИмяФайлаДанных, НайтиИменаФайловПодписей(ИмяФайлаДанных, ИменаФайловПодписей));
|
||
КонецЦикла;
|
||
|
||
// Оставшиеся файлы подписей не распознаны как подписи относящиеся к какому то файлу.
|
||
Для Каждого ИмяФайлаПодписи Из ИменаФайловПодписей Цикл
|
||
Результат.Вставить(ИмяФайлаПодписи, Новый Массив);
|
||
КонецЦикла;
|
||
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
// Обработчики событий подсистем конфигурации.
|
||
|
||
// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления.
|
||
Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт
|
||
|
||
Обработчик = Обработчики.Добавить();
|
||
Обработчик.НачальноеЗаполнение = Истина;
|
||
Обработчик.Процедура = "Справочники.ПрограммыЭлектроннойПодписиИШифрования.ЗаполнитьНачальныеНастройки";
|
||
Обработчик.РежимВыполнения = "Монопольно";
|
||
|
||
Обработчик = Обработчики.Добавить();
|
||
Обработчик.Версия = "2.2.4.7";
|
||
Обработчик.Процедура = "ЭлектроннаяПодписьСлужебный.ПеренестиНастройкиМенеджераКриптографии";
|
||
Обработчик.РежимВыполнения = "Монопольно";
|
||
|
||
Обработчик = Обработчики.Добавить();
|
||
Обработчик.Версия = "3.0.1.69";
|
||
Обработчик.Комментарий =
|
||
НСтр("ru = 'Заполнение справочника Программы электронной подписи и шифрования.'");
|
||
Обработчик.Идентификатор = Новый УникальныйИдентификатор("8e76369a-e16c-415d-bfeb-95e7e5f07a00");
|
||
Обработчик.Процедура = "Справочники.ПрограммыЭлектроннойПодписиИШифрования.ОбработатьДанныеДляПереходаНаНовуюВерсию";
|
||
Обработчик.РежимВыполнения = "Отложенно";
|
||
Обработчик.ПроцедураЗаполненияДанныхОбновления = "Справочники.ПрограммыЭлектроннойПодписиИШифрования.ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию";
|
||
Обработчик.ЧитаемыеОбъекты = "Справочник.ПрограммыЭлектроннойПодписиИШифрования";
|
||
Обработчик.ИзменяемыеОбъекты = "Справочник.ПрограммыЭлектроннойПодписиИШифрования";
|
||
Обработчик.ОчередьОтложеннойОбработки = 1;
|
||
Обработчик.ПроцедураПроверки = "ОбновлениеИнформационнойБазы.ДанныеОбновленыНаНовуюВерсиюПрограммы";
|
||
|
||
КонецПроцедуры
|
||
|
||
// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииПереименованийОбъектовМетаданных.
|
||
Процедура ПриДобавленииПереименованийОбъектовМетаданных(Итог) Экспорт
|
||
|
||
Библиотека = "СтандартныеПодсистемы";
|
||
|
||
СтароеИмя = "Роль.ИспользованиеЭЦП";
|
||
НовоеИмя = "Роль.ИспользованиеЭП";
|
||
ОбщегоНазначения.ДобавитьПереименование(Итог, "2.2.1.7", СтароеИмя, НовоеИмя, Библиотека);
|
||
|
||
СтароеИмя = "Подсистема.СтандартныеПодсистемы.Подсистема.ЭлектроннаяЦифроваяПодпись";
|
||
НовоеИмя = "Подсистема.СтандартныеПодсистемы.Подсистема.ЭлектроннаяПодпись";
|
||
ОбщегоНазначения.ДобавитьПереименование(Итог, "2.2.1.7", СтароеИмя, НовоеИмя, Библиотека);
|
||
|
||
СтароеИмя = "Роль.ИспользованиеЭП";
|
||
НовоеИмя = "Роль.ИспользованиеЭлектроннойПодписиИШифрования";
|
||
ОбщегоНазначения.ДобавитьПереименование(Итог, "2.3.1.10", СтароеИмя, НовоеИмя, Библиотека);
|
||
|
||
СтароеИмя = "Роль.ИспользованиеЭлектроннойПодписиИШифрования";
|
||
НовоеИмя = "Роль.ДобавлениеИзменениеЭлектронныхПодписейИШифрование";
|
||
ОбщегоНазначения.ДобавитьПереименование(Итог, "2.3.3.2", СтароеИмя, НовоеИмя, Библиотека);
|
||
|
||
КонецПроцедуры
|
||
|
||
// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииПараметровРаботыКлиента.
|
||
Процедура ПриДобавленииПараметровРаботыКлиента(Параметры) Экспорт
|
||
|
||
Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда
|
||
НастройкиПодсистемы = Новый Структура;
|
||
НастройкиПодсистемы.Вставить("ПерсональныеНастройки", ЭлектроннаяПодпись.ПерсональныеНастройки());
|
||
НастройкиПодсистемы.Вставить("ОбщиеНастройки", ЭлектроннаяПодпись.ОбщиеНастройки());
|
||
НастройкиПодсистемы = Новый ФиксированнаяСтруктура(НастройкиПодсистемы);
|
||
Параметры.Вставить("ЭлектроннаяПодпись", НастройкиПодсистемы);
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
// См. ЗагрузкаДанныхИзФайлаПереопределяемый.ПриОпределенииСправочниковДляЗагрузкиДанных.
|
||
Процедура ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники) Экспорт
|
||
|
||
// Загрузка в справочник ПрограммыЭлектроннойПодписиИШифрования запрещена.
|
||
СтрокаТаблицы = ЗагружаемыеСправочники.Найти(Метаданные.Справочники.ПрограммыЭлектроннойПодписиИШифрования.ПолноеИмя(), "ПолноеИмя");
|
||
Если СтрокаТаблицы <> Неопределено Тогда
|
||
ЗагружаемыеСправочники.Удалить(СтрокаТаблицы);
|
||
КонецЕсли;
|
||
|
||
// Загрузка в справочник СертификатыКлючейЭлектроннойПодписиИШифрования запрещена.
|
||
СтрокаТаблицы = ЗагружаемыеСправочники.Найти(Метаданные.Справочники.СертификатыКлючейЭлектроннойПодписиИШифрования.ПолноеИмя(), "ПолноеИмя");
|
||
Если СтрокаТаблицы <> Неопределено Тогда
|
||
ЗагружаемыеСправочники.Удалить(СтрокаТаблицы);
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
// См. ГрупповоеИзменениеОбъектовПереопределяемый.ПриОпределенииОбъектовСРедактируемымиРеквизитами.
|
||
Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт
|
||
Объекты.Вставить(Метаданные.Справочники.ПрограммыЭлектроннойПодписиИШифрования.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
|
||
Объекты.Вставить(Метаданные.Справочники.СертификатыКлючейЭлектроннойПодписиИШифрования.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке");
|
||
КонецПроцедуры
|
||
|
||
#КонецОбласти
|
||
|
||
#Область СлужебныеПроцедурыИФункции
|
||
|
||
// Возвращает менеджер криптографии (на сервере) для указанной программы.
|
||
//
|
||
// Параметры:
|
||
// Операция - Строка - если не пустая, то должна содержать одну из строк, которые определяют
|
||
// операцию для вставки в описание ошибки: Подписание, ПроверкаПодписи, Шифрование,
|
||
// Расшифровка, ПроверкаСертификата, ПолучениеСертификатов.
|
||
//
|
||
// ПоказатьОшибку - Булево - если Истина, тогда будет вызвано исключение, содержащее описание ошибки.
|
||
//
|
||
// ОписаниеОшибки - Строка - возвращаемое описание ошибки, когда функция возвратила значение Неопределено.
|
||
// - Структура - содержит ошибки обращения к программам, если возвращено Неопределено.
|
||
// * ОписаниеОшибки - Строка - полное описание ошибки, когда оно возвращается строкой.
|
||
// * ЗаголовокОшибки - Строка - заголовок ошибки, который соответствует операции.
|
||
// * ИмяКомпьютера - Строка - имя компьютера при получении менеджера криптографии.
|
||
// * Описание - Строка - описание общей ошибки.
|
||
// * Общая - Булево - если Истина, то содержит описание ошибки для всех программ,
|
||
// иначе альтернативное описание массиву Ошибки.
|
||
// * КАдминистратору - Булево - для исправления общей ошибки требуются права администратора.
|
||
// * Ошибки - Массив - содержит структуры описания ошибок программ со свойствами:
|
||
// * Программа - СправочникСсылка.ПрограммыЭлектроннойПодписиИШифрования.
|
||
// * Описание - Строка - содержит представление ошибки.
|
||
// * ИзИсключения - Булево - описание содержит краткое представление информации об ошибке.
|
||
// * НеУказанПуть - Булево - описание содержит ошибку о неуказанном пути для ОС Linux.
|
||
// * КАдминистратору - Булево - для исправления ошибки требуются права администратора.
|
||
//
|
||
// Программа - Неопределено - возвращает менеджер криптографии первой
|
||
// программы из справочника для которой удалось его создать.
|
||
// - СправочникСсылка.ПрограммыЭлектроннойПодписиИШифрования - программа
|
||
// для которой нужно создать и вернуть менеджер криптографии.
|
||
//
|
||
// Возвращаемое значение:
|
||
// МенеджерКриптографии - менеджер криптографии.
|
||
// Неопределено - произошла ошибка, описание которой в параметре ОписаниеОшибки.
|
||
//
|
||
Функция МенеджерКриптографии(Операция, ПоказатьОшибку = Истина, ОписаниеОшибки = "", Программа = Неопределено) Экспорт
|
||
|
||
ИмяКомпьютера = ИмяКомпьютера();
|
||
|
||
Ошибки = Новый Массив;
|
||
Менеджер = НовыйМенеджерКриптографии(Программа, Ошибки, ИмяКомпьютера);
|
||
|
||
Если Менеджер <> Неопределено Тогда
|
||
Возврат Менеджер;
|
||
КонецЕсли;
|
||
|
||
Если Операция = "Подписание" Тогда
|
||
ЗаголовокОшибки = НСтр("ru = 'Не удалось подписать данные на сервере %1 по причине:'");
|
||
|
||
ИначеЕсли Операция = "ПроверкаПодписи" Тогда
|
||
ЗаголовокОшибки = НСтр("ru = 'Не удалось проверить подпись на сервере %1 по причине:'");
|
||
|
||
ИначеЕсли Операция = "Шифрование" Тогда
|
||
ЗаголовокОшибки = НСтр("ru = 'Не удалось зашифровать данные на сервере %1 по причине:'");
|
||
|
||
ИначеЕсли Операция = "Расшифровка" Тогда
|
||
ЗаголовокОшибки = НСтр("ru = 'Не удалось расшифровать данные на сервере %1 по причине:'");
|
||
|
||
ИначеЕсли Операция = "ПроверкаСертификата" Тогда
|
||
ЗаголовокОшибки = НСтр("ru = 'Не удалось проверить сертификат на сервере %1 по причине:'");
|
||
|
||
ИначеЕсли Операция = "ПолучениеСертификатов" Тогда
|
||
ЗаголовокОшибки = НСтр("ru = 'Не удалось получить сертификаты на сервере %1 по причине:'");
|
||
|
||
ИначеЕсли Операция <> "" Тогда
|
||
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
|
||
НСтр("ru = 'Ошибка в функции МенеджерКриптографии.
|
||
|Неверное значение параметра Операция ""%1"".'"), Операция);
|
||
|
||
ИначеЕсли ТипЗнч(ОписаниеОшибки) = Тип("Структура")
|
||
И ОписаниеОшибки.Свойство("ЗаголовокОшибки") Тогда
|
||
|
||
ЗаголовокОшибки = ОписаниеОшибки.ЗаголовокОшибки;
|
||
Иначе
|
||
ЗаголовокОшибки = НСтр("ru = 'Не удалось выполнить операцию на сервере %1 по причине:'");
|
||
КонецЕсли;
|
||
|
||
ЗаголовокОшибки = СтрЗаменить(ЗаголовокОшибки, "%1", ИмяКомпьютера);
|
||
|
||
СвойстваОшибки = Новый Структура;
|
||
СвойстваОшибки.Вставить("ЗаголовокОшибки", ЗаголовокОшибки);
|
||
СвойстваОшибки.Вставить("ИмяКомпьютера", ИмяКомпьютера);
|
||
СвойстваОшибки.Вставить("КАдминистратору", Истина);
|
||
СвойстваОшибки.Вставить("Общая", Ложь);
|
||
СвойстваОшибки.Вставить("Ошибки", Ошибки);
|
||
|
||
Если Ошибки.Количество() = 0 Тогда
|
||
ТекстОшибки = НСтр("ru = 'Не предусмотрено использование ни одной программы.'");
|
||
СвойстваОшибки.Общая = Истина;
|
||
СвойстваОшибки.Вставить("Инструкция", Истина);
|
||
СвойстваОшибки.Вставить("НастройкаПрограмм", Истина);
|
||
|
||
ИначеЕсли Программа <> Неопределено Тогда
|
||
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
|
||
НСтр("ru = 'Программа ""%1"" не доступна или не установлена.'"), Программа);
|
||
Иначе
|
||
ТекстОшибки = НСтр("ru = 'Ни одна из программ не доступна или не установлена.'");
|
||
КонецЕсли;
|
||
СвойстваОшибки.Вставить("Описание", ТекстОшибки);
|
||
|
||
Если Не Пользователи.ЭтоПолноправныйПользователь(,, Ложь) Тогда
|
||
ТекстОшибки = ТекстОшибки + Символы.ПС + Символы.ПС
|
||
+ НСтр("ru = 'Обратитесь к администратору.'");
|
||
КонецЕсли;
|
||
|
||
СвойстваОшибки.Вставить("ОписаниеОшибки", ЗаголовокОшибки + Символы.ПС + ТекстОшибки);
|
||
|
||
Если ТипЗнч(ОписаниеОшибки) = Тип("Структура") Тогда
|
||
ОписаниеОшибки = СвойстваОшибки;
|
||
Иначе
|
||
ОписаниеОшибки = СвойстваОшибки.ОписаниеОшибки;
|
||
КонецЕсли;
|
||
|
||
Если ПоказатьОшибку Тогда
|
||
ВызватьИсключение ТекстОшибки;
|
||
КонецЕсли;
|
||
|
||
Возврат Неопределено;
|
||
|
||
КонецФункции
|
||
|
||
// Находит сертификат на компьютере по строке отпечатка.
|
||
//
|
||
// Параметры:
|
||
// Отпечаток - Строка - Base64 кодированный отпечаток сертификата.
|
||
// ТолькоВЛичномХранилище - Булево - если Истина, тогда искать в личном хранилище, иначе везде.
|
||
//
|
||
// Возвращаемое значение:
|
||
// СертификатКриптографии - сертификат электронной подписи и шифрования.
|
||
// Неопределено - сертификат не найден.
|
||
//
|
||
Функция ПолучитьСертификатПоОтпечатку(Отпечаток, ТолькоВЛичномХранилище,
|
||
ПоказатьОшибку = Истина, Программа = Неопределено, ОписаниеОшибки = "") Экспорт
|
||
|
||
МенеджерКриптографии = МенеджерКриптографии("ПолучениеСертификатов",
|
||
ПоказатьОшибку, ОписаниеОшибки, Программа);
|
||
|
||
Если МенеджерКриптографии = Неопределено Тогда
|
||
Возврат Неопределено;
|
||
КонецЕсли;
|
||
|
||
ТипХранилища = ЭлектроннаяПодписьСлужебныйКлиентСервер.ТипХранилищаДляПоискаСертификата(ТолькоВЛичномХранилище);
|
||
|
||
Попытка
|
||
ДвоичныеДанныеОтпечатка = Base64Значение(Отпечаток);
|
||
Исключение
|
||
Если ПоказатьОшибку Тогда
|
||
ВызватьИсключение;
|
||
КонецЕсли;
|
||
ИнформацияОбОшибке = ИнформацияОбОшибке();
|
||
ПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке);
|
||
КонецПопытки;
|
||
|
||
Если Не ЗначениеЗаполнено(ПредставлениеОшибки) Тогда
|
||
Попытка
|
||
ХранилищеСертификатовКриптографии = МенеджерКриптографии.ПолучитьХранилищеСертификатов(ТипХранилища);
|
||
Исключение
|
||
Если ПоказатьОшибку Тогда
|
||
ВызватьИсключение;
|
||
КонецЕсли;
|
||
ИнформацияОбОшибке = ИнформацияОбОшибке();
|
||
ПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке);
|
||
КонецПопытки;
|
||
КонецЕсли;
|
||
|
||
Если Не ЗначениеЗаполнено(ПредставлениеОшибки) Тогда
|
||
Попытка
|
||
Сертификат = ХранилищеСертификатовКриптографии.НайтиПоОтпечатку(ДвоичныеДанныеОтпечатка);
|
||
Исключение
|
||
Если ПоказатьОшибку Тогда
|
||
ВызватьИсключение;
|
||
КонецЕсли;
|
||
ИнформацияОбОшибке = ИнформацияОбОшибке();
|
||
ПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке);
|
||
КонецПопытки;
|
||
КонецЕсли;
|
||
|
||
Если ТипЗнч(Сертификат) = Тип("СертификатКриптографии") Тогда
|
||
Возврат Сертификат;
|
||
КонецЕсли;
|
||
|
||
Если ЗначениеЗаполнено(ПредставлениеОшибки) Тогда
|
||
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
|
||
НСтр("ru = 'Сертификат не найден на сервере по причине:
|
||
|%1'")
|
||
+ Символы.ПС,
|
||
ПредставлениеОшибки);
|
||
Иначе
|
||
ТекстОшибки = НСтр("ru = 'Сертификат не найден на сервере.'");
|
||
КонецЕсли;
|
||
|
||
Если Не Пользователи.ЭтоПолноправныйПользователь(,, Ложь) Тогда
|
||
ТекстОшибки = ТекстОшибки + Символы.ПС + НСтр("ru = 'Обратитесь к администратору.'")
|
||
КонецЕсли;
|
||
|
||
ТекстОшибки = СокрП(ТекстОшибки);
|
||
|
||
Если ТипЗнч(ОписаниеОшибки) = Тип("Структура") Тогда
|
||
ОписаниеОшибки = Новый Структура;
|
||
ОписаниеОшибки.Вставить("ОписаниеОшибки", ТекстОшибки);
|
||
Иначе
|
||
ОписаниеОшибки = ПредставлениеОшибки;
|
||
КонецЕсли;
|
||
|
||
Возврат Неопределено;
|
||
|
||
КонецФункции
|
||
|
||
// Только для внутреннего использования.
|
||
Функция ДобавкаВремени() Экспорт
|
||
|
||
Возврат ТекущаяДатаСеанса() - ТекущаяУниверсальнаяДата();
|
||
|
||
КонецФункции
|
||
|
||
// Сохраняет настройки текущего пользователя для работы с электронной подписью.
|
||
Процедура СохранитьПерсональныеНастройки(ПерсональныеНастройки) Экспорт
|
||
|
||
КлючПодсистемы = КлючХраненияНастроек();
|
||
|
||
Для Каждого КлючИЗначение Из ПерсональныеНастройки Цикл
|
||
ОбщегоНазначения.ХранилищеОбщихНастроекСохранить(КлючПодсистемы, КлючИЗначение.Ключ,
|
||
КлючИЗначение.Значение);
|
||
КонецЦикла;
|
||
|
||
КонецПроцедуры
|
||
|
||
// Ключ, который используется для хранения настроек подсистемы.
|
||
Функция КлючХраненияНастроек() Экспорт
|
||
|
||
Возврат "ЭЦП"; // Не заменять на "ЭП". Используется для обратной совместимости.
|
||
|
||
КонецФункции
|
||
|
||
// Только для внутреннего использования.
|
||
Процедура ПередНачаломРедактированияСертификатаКлюча(Ссылка, Сертификат, ПараметрыРеквизитов) Экспорт
|
||
|
||
Таблица = Новый ТаблицаЗначений;
|
||
Таблица.Колонки.Добавить("ИмяРеквизита", Новый ОписаниеТипов("Строка"));
|
||
Таблица.Колонки.Добавить("ТолькоПросмотр", Новый ОписаниеТипов("Булево"));
|
||
Таблица.Колонки.Добавить("ПроверкаЗаполнения", Новый ОписаниеТипов("Булево"));
|
||
Таблица.Колонки.Добавить("Видимость", Новый ОписаниеТипов("Булево"));
|
||
Таблица.Колонки.Добавить("ЗначениеЗаполнения");
|
||
|
||
ЭлектроннаяПодписьПереопределяемый.ПередНачаломРедактированияСертификатаКлюча(Ссылка, Сертификат, Таблица);
|
||
|
||
ПараметрыРеквизитов = Новый Структура;
|
||
|
||
Для каждого Строка Из Таблица Цикл
|
||
Параметры = Новый Структура;
|
||
Параметры.Вставить("ТолькоПросмотр", Строка.ТолькоПросмотр);
|
||
Параметры.Вставить("ПроверкаЗаполнения", Строка.ПроверкаЗаполнения);
|
||
Параметры.Вставить("Видимость", Строка.Видимость);
|
||
Параметры.Вставить("ЗначениеЗаполнения", Строка.ЗначениеЗаполнения);
|
||
ПараметрыРеквизитов.Вставить(Строка.ИмяРеквизита, Параметры);
|
||
КонецЦикла;
|
||
|
||
КонецПроцедуры
|
||
|
||
// Только для внутреннего использования.
|
||
Процедура ПроверитьУникальностьПредставления(Представление, СертификатСсылка, Поле, Отказ) Экспорт
|
||
|
||
Если Не ЗначениеЗаполнено(Представление) Тогда
|
||
Возврат;
|
||
КонецЕсли;
|
||
|
||
Запрос = Новый Запрос;
|
||
Запрос.УстановитьПараметр("Ссылка", СертификатСсылка);
|
||
Запрос.УстановитьПараметр("Наименование", Представление);
|
||
|
||
Запрос.Текст =
|
||
"ВЫБРАТЬ
|
||
| ИСТИНА КАК ЗначениеИстина
|
||
|ИЗ
|
||
| Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования КАК Сертификаты
|
||
|ГДЕ
|
||
| Сертификаты.Ссылка <> &Ссылка
|
||
| И Сертификаты.Наименование = &Наименование";
|
||
|
||
Если Не Запрос.Выполнить().Пустой() Тогда
|
||
ТекстСообщения = НСтр("ru = 'Сертификат с таким представлением уже существует.'");
|
||
ОбщегоНазначения.СообщитьПользователю(ТекстСообщения,, Поле,, Отказ);
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
// Только для внутреннего использования.
|
||
Функция СведенияОПодписиДляЖурналаРегистрации(ДатаПодписи, СвойстваПодписи, ЭтоОшибкаПодписания = Ложь) Экспорт
|
||
|
||
Если СвойстваПодписи.Свойство("ОписаниеСертификата") Тогда
|
||
СвойстваСертификата = СвойстваПодписи.ОписаниеСертификата;
|
||
Иначе
|
||
СвойстваСертификата = Новый Структура;
|
||
СвойстваСертификата.Вставить("СерийныйНомер", Base64Значение(""));
|
||
СвойстваСертификата.Вставить("КемВыдан", "");
|
||
СвойстваСертификата.Вставить("КомуВыдан", "");
|
||
СвойстваСертификата.Вставить("ДатаНачала", '00010101');
|
||
СвойстваСертификата.Вставить("ДатаОкончания", '00010101');
|
||
|
||
Если ТипЗнч(СвойстваПодписи.Сертификат) = Тип("Строка")
|
||
И ЭтоАдресВременногоХранилища(СвойстваПодписи.Сертификат) Тогда
|
||
Сертификат = ПолучитьИзВременногоХранилища(СвойстваПодписи.Сертификат);
|
||
Иначе
|
||
Сертификат = СвойстваПодписи.Сертификат;
|
||
КонецЕсли;
|
||
|
||
Если ТипЗнч(Сертификат) = Тип("ДвоичныеДанные") Тогда
|
||
СертификатКриптографии = Новый СертификатКриптографии(Сертификат);
|
||
СвойстваСертификата = ЭлектроннаяПодпись.СвойстваСертификата(СертификатКриптографии);
|
||
|
||
ИначеЕсли СвойстваПодписи.Свойство("КомуВыданСертификат") Тогда
|
||
СвойстваСертификата.КомуВыдан = СвойстваПодписи.КомуВыданСертификат;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
|
||
Если ЭтоОшибкаПодписания Тогда
|
||
СведенияОПодписи = "";
|
||
Иначе
|
||
СведенияОПодписи = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
|
||
НСтр("ru = 'Дата подписи: %1'"), Формат(ДатаПодписи, "ДЛФ=DT")) + Символы.ПС;
|
||
КонецЕсли;
|
||
|
||
СведенияОПодписи = СведенияОПодписи + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
|
||
НСтр("ru = 'Сертификат: %1
|
||
|Кем выдан: %2
|
||
|Владелец: %3
|
||
|Действителен: с %4 по %5'"),
|
||
Строка(СвойстваСертификата.СерийныйНомер),
|
||
СвойстваСертификата.КемВыдан,
|
||
СвойстваСертификата.КомуВыдан,
|
||
Формат(СвойстваСертификата.ДатаНачала, "ДЛФ=D"),
|
||
Формат(СвойстваСертификата.ДатаОкончания, "ДЛФ=D"));
|
||
|
||
Возврат СведенияОПодписи;
|
||
|
||
КонецФункции
|
||
|
||
// Только для внутреннего использования.
|
||
Процедура ЗарегистрироватьПодписаниеДанныхВЖурнале(ЭлементДанных, ОписаниеОшибки = "") Экспорт
|
||
|
||
ЭтоОшибкаПодписания = ЗначениеЗаполнено(ОписаниеОшибки);
|
||
|
||
Если ТипЗнч(ЭлементДанных.СвойстваПодписи) = Тип("Строка") Тогда
|
||
СвойстваПодписи = ПолучитьИзВременногоХранилища(ЭлементДанных.СвойстваПодписи);
|
||
Иначе
|
||
СвойстваПодписи = ЭлементДанных.СвойстваПодписи;
|
||
КонецЕсли;
|
||
|
||
СообщениеЖурналаРегистрации = СведенияОПодписиДляЖурналаРегистрации(
|
||
СвойстваПодписи.ДатаПодписи, СвойстваПодписи, ЭтоОшибкаПодписания);
|
||
|
||
Если ЭтоОшибкаПодписания Тогда
|
||
ИмяСобытия = НСтр("ru = 'Электронная подпись.Ошибка подписания данных'",
|
||
ОбщегоНазначения.КодОсновногоЯзыка());
|
||
|
||
СообщениеЖурналаРегистрации = СообщениеЖурналаРегистрации + "
|
||
|
|
||
|" + ОписаниеОшибки;
|
||
Иначе
|
||
ИмяСобытия = НСтр("ru = 'Электронная подпись.Подписание данных'",
|
||
ОбщегоНазначения.КодОсновногоЯзыка());
|
||
КонецЕсли;
|
||
|
||
Если ОбщегоНазначения.ЭтоСсылка(ТипЗнч(ЭлементДанных.ПредставлениеДанных)) Тогда
|
||
МетаданныеЭлементаДанных = ЭлементДанных.ПредставлениеДанных.Метаданные();
|
||
Иначе
|
||
МетаданныеЭлементаДанных = Неопределено;
|
||
КонецЕсли;
|
||
|
||
ЗаписьЖурналаРегистрации(ИмяСобытия,
|
||
УровеньЖурналаРегистрации.Информация,
|
||
МетаданныеЭлементаДанных,
|
||
ЭлементДанных.ПредставлениеДанных,
|
||
СообщениеЖурналаРегистрации);
|
||
|
||
КонецПроцедуры
|
||
|
||
// Только для внутреннего использования.
|
||
Процедура ОбновитьСписокСертификатов(Сертификаты, СвойстваСертификатовНаКлиенте, КромеУжеДобавленных,
|
||
Личные, Ошибка, БезОтбора, ОтборПоОрганизации = Неопределено) Экспорт
|
||
|
||
ТаблицаСвойствСертификатов = Новый ТаблицаЗначений;
|
||
ТаблицаСвойствСертификатов.Колонки.Добавить("Отпечаток", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(255)));
|
||
ТаблицаСвойствСертификатов.Колонки.Добавить("КемВыдан");
|
||
ТаблицаСвойствСертификатов.Колонки.Добавить("Представление");
|
||
ТаблицаСвойствСертификатов.Колонки.Добавить("НаКлиенте", Новый ОписаниеТипов("Булево"));
|
||
ТаблицаСвойствСертификатов.Колонки.Добавить("НаСервере", Новый ОписаниеТипов("Булево"));
|
||
ТаблицаСвойствСертификатов.Колонки.Добавить("ЭтоЗаявление", Новый ОписаниеТипов("Булево"));
|
||
ТаблицаСвойствСертификатов.Колонки.Добавить("ВОблачномСервисе", Новый ОписаниеТипов("Булево"));
|
||
|
||
Для Каждого СвойстваСертификата Из СвойстваСертификатовНаКлиенте Цикл
|
||
НоваяСтрока = ТаблицаСвойствСертификатов.Добавить();
|
||
ЗаполнитьЗначенияСвойств(НоваяСтрока, СвойстваСертификата);
|
||
НоваяСтрока.НаКлиенте = Истина;
|
||
КонецЦикла;
|
||
|
||
ТаблицаСвойствСертификатов.Индексы.Добавить("Отпечаток");
|
||
|
||
Если ЭлектроннаяПодпись.СоздаватьЭлектронныеПодписиНаСервере() Тогда
|
||
|
||
МенеджерКриптографии = МенеджерКриптографии("ПолучениеСертификатов", Ложь, Ошибка);
|
||
Если МенеджерКриптографии <> Неопределено Тогда
|
||
|
||
МассивСертификатов = МенеджерКриптографии.ПолучитьХранилищеСертификатов(
|
||
ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты).ПолучитьВсе();
|
||
|
||
ЭлектроннаяПодписьСлужебныйКлиентСервер.ДобавитьСвойстваСертификатов(ТаблицаСвойствСертификатов,
|
||
МассивСертификатов, БезОтбора, ДобавкаВремени(), ТекущаяДатаСеанса());
|
||
|
||
Если Не Личные Тогда
|
||
МассивСертификатов = МенеджерКриптографии.ПолучитьХранилищеСертификатов(
|
||
ТипХранилищаСертификатовКриптографии.СертификатыПолучателей).ПолучитьВсе();
|
||
|
||
ЭлектроннаяПодписьСлужебныйКлиентСервер.ДобавитьСвойстваСертификатов(ТаблицаСвойствСертификатов,
|
||
МассивСертификатов, БезОтбора, ДобавкаВремени(), ТекущаяДатаСеанса());
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
|
||
Если ИспользоватьЭлектроннуюПодписьВМоделиСервиса() Тогда
|
||
МодульХранилищеСертификатов = ОбщегоНазначения.ОбщийМодуль("ХранилищеСертификатов");
|
||
МассивСертификатов = МодульХранилищеСертификатов.Получить("ПерсональныеСертификаты");
|
||
|
||
ЭлектроннаяПодписьСлужебныйКлиентСервер.ДобавитьСвойстваСертификатов(ТаблицаСвойствСертификатов,
|
||
МассивСертификатов, БезОтбора, ДобавкаВремени(), ТекущаяДатаСеанса(), , Истина);
|
||
|
||
Если Не Личные Тогда
|
||
МассивСертификатов = МодульХранилищеСертификатов.Получить("СертификатыПолучателей");
|
||
|
||
ЭлектроннаяПодписьСлужебныйКлиентСервер.ДобавитьСвойстваСертификатов(ТаблицаСвойствСертификатов,
|
||
МассивСертификатов, БезОтбора, ДобавкаВремени(), ТекущаяДатаСеанса(), , Истина);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
|
||
ОбработатьДобавленныеСертификаты(ТаблицаСвойствСертификатов, Не БезОтбора И КромеУжеДобавленных, ОтборПоОрганизации);
|
||
|
||
ТаблицаСвойствСертификатов.Индексы.Добавить("Представление");
|
||
ТаблицаСвойствСертификатов.Сортировать("Представление Возр");
|
||
|
||
ОбработанныеСтроки = Новый Соответствие;
|
||
Индекс = 0;
|
||
Отбор = Новый Структура("Отпечаток", "");
|
||
|
||
Для каждого СвойстваСертификата Из ТаблицаСвойствСертификатов Цикл
|
||
Отбор.Отпечаток = СвойстваСертификата.Отпечаток;
|
||
Строки = Сертификаты.НайтиСтроки(Отбор);
|
||
Если Строки.Количество() = 0 Тогда
|
||
Если Сертификаты.Количество()-1 < Индекс Тогда
|
||
Строка = Сертификаты.Добавить();
|
||
Иначе
|
||
Строка = Сертификаты.Вставить(Индекс);
|
||
КонецЕсли;
|
||
Иначе
|
||
Строка = Строки[0];
|
||
ИндексСтроки = Сертификаты.Индекс(Строка);
|
||
Если ИндексСтроки <> Индекс Тогда
|
||
Сертификаты.Сдвинуть(ИндексСтроки, Индекс - ИндексСтроки);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
// Обновление только измененных значений, чтобы таблица формы не обновлялась лишний раз.
|
||
ОбновитьЗначение(Строка.Отпечаток, СвойстваСертификата.Отпечаток);
|
||
ОбновитьЗначение(Строка.Представление, СвойстваСертификата.Представление);
|
||
ОбновитьЗначение(Строка.КемВыдан, СвойстваСертификата.КемВыдан);
|
||
ОбновитьЗначение(Строка.НаКлиенте, СвойстваСертификата.НаКлиенте);
|
||
ОбновитьЗначение(Строка.НаСервере, СвойстваСертификата.НаСервере);
|
||
ОбновитьЗначение(Строка.ЭтоЗаявление, СвойстваСертификата.ЭтоЗаявление);
|
||
ОбновитьЗначение(Строка.ВОблачномСервисе, СвойстваСертификата.ВОблачномСервисе);
|
||
ОбработанныеСтроки.Вставить(Строка, Истина);
|
||
Индекс = Индекс + 1;
|
||
КонецЦикла;
|
||
|
||
Индекс = Сертификаты.Количество()-1;
|
||
Пока Индекс >=0 Цикл
|
||
Строка = Сертификаты.Получить(Индекс);
|
||
Если ОбработанныеСтроки.Получить(Строка) = Неопределено Тогда
|
||
Сертификаты.Удалить(Индекс);
|
||
КонецЕсли;
|
||
Индекс = Индекс-1;
|
||
КонецЦикла;
|
||
|
||
КонецПроцедуры
|
||
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
// Общие процедуры и функции управляемых форм.
|
||
|
||
// Только для внутреннего использования.
|
||
Процедура НастроитьФормуПодписанияШифрованияРасшифровки(Форма, Шифрование = Ложь, Расшифровка = Ложь) Экспорт
|
||
|
||
Элементы = Форма.Элементы;
|
||
Параметры = Форма.Параметры;
|
||
|
||
Элементы.Сертификат.КнопкаВыпадающегоСписка = Истина;
|
||
Элементы.Сертификат.ОтображениеКнопкиВыбора = ОтображениеКнопкиВыбора.ОтображатьВВыпадающемСписке;
|
||
|
||
Форма.Заголовок = Параметры.Операция;
|
||
Форма.ВыполнятьНаСервере = Параметры.ВыполнятьНаСервере;
|
||
|
||
Если Шифрование Тогда
|
||
Если Форма.УказанНеизменяемыйНаборСертификатов Тогда
|
||
Форма.БезПодтверждения = Параметры.БезПодтверждения;
|
||
КонецЕсли;
|
||
Иначе
|
||
Форма.ОтборСертификатов = Новый СписокЗначений;
|
||
Если ТипЗнч(Параметры.ОтборСертификатов) = Тип("Массив") Тогда
|
||
Форма.ОтборСертификатов.ЗагрузитьЗначения(Параметры.ОтборСертификатов);
|
||
ИначеЕсли ТипЗнч(Параметры.ОтборСертификатов) = Тип("Структура") Тогда
|
||
Форма.ОтборСертификатов = Параметры.ОтборСертификатов.Организация;
|
||
КонецЕсли;
|
||
Форма.БезПодтверждения = Параметры.БезПодтверждения;
|
||
КонецЕсли;
|
||
|
||
Если ЗначениеЗаполнено(Параметры.ЗаголовокДанных) Тогда
|
||
Элементы.ПредставлениеДанных.Заголовок = Параметры.ЗаголовокДанных;
|
||
Иначе
|
||
Элементы.ПредставлениеДанных.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет;
|
||
КонецЕсли;
|
||
|
||
Форма.ПредставлениеДанных = Параметры.ПредставлениеДанных;
|
||
Элементы.ПредставлениеДанных.Гиперссылка = Параметры.ПредставлениеДанныхОткрывается;
|
||
|
||
Если Не ЗначениеЗаполнено(Форма.ПредставлениеДанных) Тогда
|
||
Элементы.ПредставлениеДанных.Видимость = Ложь;
|
||
КонецЕсли;
|
||
|
||
Если Расшифровка Тогда
|
||
ЗаполнитьОтборОтпечатков(Форма);
|
||
ИначеЕсли Не Шифрование Тогда // Подписание
|
||
Элементы.Комментарий.Видимость = Параметры.ПоказатьКомментарий И Не Форма.БезПодтверждения;
|
||
КонецЕсли;
|
||
|
||
ЗаполнитьСуществующиеСертификатыПользователя(Форма.СертификатСписокВыбора,
|
||
Параметры.ОтпечаткиСертификатовНаКлиенте, Форма.ОтборСертификатов, Форма.ОтборОтпечатков);
|
||
|
||
Сертификат = Неопределено;
|
||
|
||
Если Расшифровка Тогда
|
||
Для каждого ЭлементСписка Из Форма.СертификатСписокВыбора Цикл
|
||
Если ТипЗнч(ЭлементСписка.Значение) = Тип("Строка") Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
Сертификат = ЭлементСписка.Значение;
|
||
Прервать;
|
||
КонецЦикла;
|
||
|
||
ИначеЕсли ПравоДоступа("СохранениеДанныхПользователя", Метаданные) Тогда
|
||
Если Шифрование Тогда
|
||
Сертификат = ХранилищеОбщихНастроек.Загрузить("Криптография", "СертификатДляШифрования");
|
||
Иначе
|
||
Сертификат = ХранилищеОбщихНастроек.Загрузить("Криптография", "СертификатДляПодписания");
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
|
||
Если ТипЗнч(Форма.ОтборСертификатов) = Тип("СписокЗначений") Тогда
|
||
Если Форма.СертификатСписокВыбора.Количество() = 0 Тогда
|
||
Сертификат = Неопределено;
|
||
Иначе
|
||
Сертификат = Форма.СертификатСписокВыбора[0].Значение;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
|
||
Если Не (Шифрование И Форма.УказанНеизменяемыйНаборСертификатов) Тогда
|
||
Форма.Сертификат = Сертификат;
|
||
КонецЕсли;
|
||
|
||
Если ЗначениеЗаполнено(Форма.Сертификат)
|
||
И ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Форма.Сертификат, "Ссылка") <> Форма.Сертификат Тогда
|
||
|
||
Форма.Сертификат = Неопределено;
|
||
КонецЕсли;
|
||
|
||
Если ЗначениеЗаполнено(Форма.Сертификат) Тогда
|
||
Если Шифрование Тогда
|
||
Форма.ИмяПоляАктивизироватьПоУмолчанию = "СертификатыШифрования";
|
||
Иначе
|
||
Форма.ИмяПоляАктивизироватьПоУмолчанию = "Пароль";
|
||
КонецЕсли;
|
||
Иначе
|
||
Если Не (Шифрование И Форма.УказанНеизменяемыйНаборСертификатов) Тогда
|
||
Форма.ИмяПоляАктивизироватьПоУмолчанию = "Сертификат";
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
|
||
ЗаполнитьДополнительныеСвойстваСертификата(Форма);
|
||
|
||
Форма.МенеджерКриптографииНаСервереОписаниеОшибки = Новый Структура;
|
||
Если ЭлектроннаяПодпись.СоздаватьЭлектронныеПодписиНаСервере() Тогда
|
||
МенеджерКриптографии("ПолучениеСертификатов",
|
||
Ложь, Форма.МенеджерКриптографииНаСервереОписаниеОшибки);
|
||
КонецЕсли;
|
||
|
||
Если Не Шифрование Тогда
|
||
ЭлектроннаяПодписьПереопределяемый.ПередНачаломОперации(?(Расшифровка, "Расшифровка", "Подписание"),
|
||
Параметры.ПараметрыДополнительныхДействий, Форма.ВыходныеПараметрыДополнительныхДействий);
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
// Только для внутреннего использования.
|
||
Процедура СертификатПриИзмененииНаСервере(Форма, ОтпечаткиСертификатовНаКлиенте, Шифрование = Ложь, Расшифровка = Ложь) Экспорт
|
||
|
||
Если ТипЗнч(Форма.ОтборСертификатов) <> Тип("СписокЗначений") И ПравоДоступа("СохранениеДанныхПользователя", Метаданные) Тогда
|
||
|
||
Если Шифрование Тогда
|
||
ХранилищеОбщихНастроек.Сохранить("Криптография", "СертификатДляШифрования", Форма.Сертификат);
|
||
ИначеЕсли Не Расшифровка Тогда
|
||
ХранилищеОбщихНастроек.Сохранить("Криптография", "СертификатДляПодписания", Форма.Сертификат);
|
||
КонецЕсли;
|
||
|
||
КонецЕсли;
|
||
|
||
ЗаполнитьСуществующиеСертификатыПользователя(Форма.СертификатСписокВыбора,
|
||
ОтпечаткиСертификатовНаКлиенте, Форма.ОтборСертификатов, Форма.ОтборОтпечатков);
|
||
|
||
ЗаполнитьДополнительныеСвойстваСертификата(Форма);
|
||
|
||
КонецПроцедуры
|
||
|
||
// Только для внутреннего использования.
|
||
Функция СохраненныеСвойстваСертификата(Отпечаток, Адрес, ПараметрыРеквизитов, ДляШифрования = Ложь) Экспорт
|
||
|
||
СохраненныеСвойства = Новый Структура;
|
||
СохраненныеСвойства.Вставить("Ссылка");
|
||
СохраненныеСвойства.Вставить("Наименование");
|
||
СохраненныеСвойства.Вставить("Пользователь");
|
||
СохраненныеСвойства.Вставить("Организация");
|
||
СохраненныеСвойства.Вставить("УсиленнаяЗащитаЗакрытогоКлюча");
|
||
|
||
Запрос = Новый Запрос;
|
||
Запрос.УстановитьПараметр("Отпечаток", Отпечаток);
|
||
Запрос.Текст =
|
||
"ВЫБРАТЬ
|
||
| Сертификаты.Ссылка КАК Ссылка,
|
||
| Сертификаты.Наименование КАК Наименование,
|
||
| Сертификаты.Пользователь,
|
||
| Сертификаты.Организация,
|
||
| Сертификаты.УсиленнаяЗащитаЗакрытогоКлюча,
|
||
| Сертификаты.ДанныеСертификата
|
||
|ИЗ
|
||
| Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования КАК Сертификаты
|
||
|ГДЕ
|
||
| Сертификаты.Отпечаток = &Отпечаток";
|
||
|
||
СертификатКриптографии = Новый СертификатКриптографии(ПолучитьИзВременногоХранилища(Адрес));
|
||
|
||
ЗначенияЗаполнения = ПараметрыРеквизитов;
|
||
ПараметрыРеквизитов = Неопределено; // Заполняется в процедуре ПередНачаломРедактированияСертификатаКлюча.
|
||
|
||
Выборка = Запрос.Выполнить().Выбрать();
|
||
Если Выборка.Следующий() Тогда
|
||
ЗаполнитьЗначенияСвойств(СохраненныеСвойства, Выборка);
|
||
Иначе
|
||
СохраненныеСвойства.Ссылка = Справочники.СертификатыКлючейЭлектроннойПодписиИШифрования.ПустаяСсылка();
|
||
|
||
Если ТипЗнч(ЗначенияЗаполнения) = Тип("Структура")
|
||
И ЗначенияЗаполнения.Свойство("Организация")
|
||
И ЗначениеЗаполнено(ЗначенияЗаполнения.Организация) Тогда
|
||
|
||
СохраненныеСвойства.Организация = ЗначенияЗаполнения.Организация;
|
||
|
||
ИначеЕсли Не Метаданные.ОпределяемыеТипы.Организация.Тип.СодержитТип(Тип("Строка")) Тогда
|
||
ПолноеИмя = Метаданные.НайтиПоТипу(Метаданные.ОпределяемыеТипы.Организация.Тип.Типы()[0]).ПолноеИмя();
|
||
ИмяСправочникаОрганизации = "Справочники." + СтрРазделить(ПолноеИмя, ".")[1];
|
||
МодульОрганизации = ОбщегоНазначения.ОбщийМодуль(ИмяСправочникаОрганизации);
|
||
Если Не ДляШифрования Тогда
|
||
СохраненныеСвойства.Организация = МодульОрганизации.ОрганизацияПоУмолчанию();
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
СохраненныеСвойства.Наименование = ЭлектроннаяПодпись.ПредставлениеСертификата(СертификатКриптографии);
|
||
Если Не ДляШифрования Тогда
|
||
СохраненныеСвойства.Пользователь = Пользователи.ТекущийПользователь();
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
|
||
ПередНачаломРедактированияСертификатаКлюча(
|
||
СохраненныеСвойства.Ссылка, СертификатКриптографии, ПараметрыРеквизитов);
|
||
|
||
Если Не ЗначениеЗаполнено(СохраненныеСвойства.Ссылка) Тогда
|
||
ЗаполнитьРеквизит(СохраненныеСвойства, ПараметрыРеквизитов, "Наименование");
|
||
ЗаполнитьРеквизит(СохраненныеСвойства, ПараметрыРеквизитов, "Пользователь");
|
||
ЗаполнитьРеквизит(СохраненныеСвойства, ПараметрыРеквизитов, "Организация");
|
||
ЗаполнитьРеквизит(СохраненныеСвойства, ПараметрыРеквизитов, "УсиленнаяЗащитаЗакрытогоКлюча");
|
||
КонецЕсли;
|
||
|
||
Если Не ЗначениеЗаполнено(СохраненныеСвойства.Ссылка)
|
||
И ТипЗнч(ЗначенияЗаполнения) = Тип("Структура")
|
||
И ЗначенияЗаполнения.Свойство("Организация")
|
||
И ЗначениеЗаполнено(ЗначенияЗаполнения.Организация)
|
||
И Не ПараметрыРеквизитов.Свойство("Организация") Тогда
|
||
|
||
Параметры = Новый Структура;
|
||
Параметры.Вставить("ТолькоПросмотр", Истина);
|
||
Параметры.Вставить("ПроверкаЗаполнения", Ложь);
|
||
Параметры.Вставить("Видимость", Истина);
|
||
ПараметрыРеквизитов.Вставить("Организация", Параметры);
|
||
КонецЕсли;
|
||
|
||
Возврат СохраненныеСвойства;
|
||
|
||
КонецФункции
|
||
|
||
// Только для внутреннего использования.
|
||
Процедура ЗаписатьСертификатВСправочник(Форма, Программа = Неопределено, ДляШифрования = Ложь) Экспорт
|
||
|
||
ДополнительныеПараметры = Новый Структура;
|
||
ДополнительныеПараметры.Вставить("Наименование", Форма.СертификатНаименование);
|
||
ДополнительныеПараметры.Вставить("Пользователь", Форма.СертификатПользователь);
|
||
ДополнительныеПараметры.Вставить("Организация", Форма.СертификатОрганизация);
|
||
|
||
Если Не ДляШифрования Тогда
|
||
ДополнительныеПараметры.Вставить("Программа", Программа);
|
||
ДополнительныеПараметры.Вставить("УсиленнаяЗащитаЗакрытогоКлюча",
|
||
Форма.СертификатУсиленнаяЗащитаЗакрытогоКлюча);
|
||
КонецЕсли;
|
||
|
||
Если Не ЗначениеЗаполнено(Форма.Сертификат) Тогда
|
||
ПропускаемыеРеквизиты = Новый Соответствие;
|
||
ПропускаемыеРеквизиты.Вставить("Ссылка", Истина);
|
||
ПропускаемыеРеквизиты.Вставить("Наименование", Истина);
|
||
ПропускаемыеРеквизиты.Вставить("Организация", Истина);
|
||
ПропускаемыеРеквизиты.Вставить("УсиленнаяЗащитаЗакрытогоКлюча", Истина);
|
||
Если Не ДляШифрования И Форма.ЛичныйСписокПриДобавлении Тогда
|
||
ПропускаемыеРеквизиты.Вставить("Пользователь", Истина);
|
||
КонецЕсли;
|
||
Для каждого КлючИЗначение Из Форма.СертификатПараметрыРеквизитов Цикл
|
||
ИмяРеквизита = КлючИЗначение.Ключ;
|
||
Свойства = КлючИЗначение.Значение;
|
||
Если ПропускаемыеРеквизиты.Получить(ИмяРеквизита) <> Неопределено Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
Если Свойства.ЗначениеЗаполнения = Неопределено Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
ДополнительныеПараметры.Вставить(ИмяРеквизита, Свойства.ЗначениеЗаполнения);
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
|
||
Форма.Сертификат = ЭлектроннаяПодпись.ЗаписатьСертификатВСправочник(Форма.СертификатАдрес,
|
||
ДополнительныеПараметры);
|
||
|
||
КонецПроцедуры
|
||
|
||
// Только для внутреннего использования.
|
||
Процедура УстановитьУсловноеОформлениеСпискаСертификатов(Список, ИсключитьЗаявления = Ложь) Экспорт
|
||
|
||
ЭлементУсловногоОформления = Список.УсловноеОформление.Элементы.Добавить();
|
||
|
||
ЭлементЦветаОформления = ЭлементУсловногоОформления.Оформление.Элементы.Найти("TextColor");
|
||
ЭлементЦветаОформления.Значение = Метаданные.ЭлементыСтиля.ТекстЗапрещеннойЯчейкиЦвет.Значение;
|
||
ЭлементЦветаОформления.Использование = Истина;
|
||
|
||
Если ИсключитьЗаявления И Метаданные.Обработки.Найти("ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата") <> Неопределено Тогда
|
||
ОбработкаЗаявлениеНаВыпускНовогоКвалифицированногоСертификата =
|
||
ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(
|
||
"Обработка.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата");
|
||
ОбработкаЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.УстановитьУсловноеОформлениеСпискаСертификатов(
|
||
ЭлементУсловногоОформления);
|
||
КонецЕсли;
|
||
|
||
ГруппаЭлементовОтбора = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
|
||
ГруппаЭлементовОтбора.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаНе;
|
||
|
||
ЭлементОтбораДанных = ГруппаЭлементовОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
|
||
ЭлементОтбораДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отозван");
|
||
ЭлементОтбораДанных.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
|
||
ЭлементОтбораДанных.ПравоеЗначение = Ложь;
|
||
ЭлементОтбораДанных.Использование = Истина;
|
||
|
||
ЭлементОтбораДанных = ГруппаЭлементовОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
|
||
ЭлементОтбораДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ДействителенДо");
|
||
ЭлементОтбораДанных.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
|
||
ЭлементОтбораДанных.ПравоеЗначение = Новый СтандартнаяДатаНачала(ВариантСтандартнойДатыНачала.НачалоЭтогоДня);
|
||
ЭлементОтбораДанных.Использование = Истина;
|
||
|
||
ЭлементОформляемогоПоля = ЭлементУсловногоОформления.Поля.Элементы.Добавить();
|
||
ЭлементОформляемогоПоля.Поле = Новый ПолеКомпоновкиДанных("");
|
||
ЭлементОформляемогоПоля.Использование = Истина;
|
||
|
||
КонецПроцедуры
|
||
|
||
// Только для внутреннего использования.
|
||
Функция СертификатИзДвоичныхДанных(ДанныеСертификата) Экспорт
|
||
|
||
Если ТипЗнч(ДанныеСертификата) <> Тип("ДвоичныеДанные") Тогда
|
||
Возврат Неопределено;
|
||
КонецЕсли;
|
||
|
||
Попытка
|
||
СертификатКриптографии = Новый СертификатКриптографии(ДанныеСертификата);
|
||
Исключение
|
||
СертификатКриптографии = Неопределено;
|
||
КонецПопытки;
|
||
|
||
Если СертификатКриптографии <> Неопределено Тогда
|
||
Возврат СертификатКриптографии;
|
||
КонецЕсли;
|
||
|
||
ПолноеИмяВременногоФайла = ПолучитьИмяВременногоФайла("cer");
|
||
ДанныеСертификата.Записать(ПолноеИмяВременногоФайла);
|
||
Текст = Новый ТекстовыйДокумент;
|
||
Текст.Прочитать(ПолноеИмяВременногоФайла);
|
||
|
||
Попытка
|
||
УдалитьФайлы(ПолноеИмяВременногоФайла);
|
||
Исключение
|
||
ЗаписьЖурналаРегистрации(
|
||
НСтр("ru = 'Электронная подпись.Удаление временного файла'",
|
||
ОбщегоНазначения.КодОсновногоЯзыка()),
|
||
УровеньЖурналаРегистрации.Ошибка, , ,
|
||
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
|
||
КонецПопытки;
|
||
|
||
Если Текст.КоличествоСтрок() < 3
|
||
Или Текст.ПолучитьСтроку(1) <> "-----BEGIN CERTIFICATE-----"
|
||
Или Текст.ПолучитьСтроку(Текст.КоличествоСтрок()) <> "-----END CERTIFICATE-----" Тогда
|
||
|
||
Возврат Неопределено;
|
||
КонецЕсли;
|
||
|
||
Текст.УдалитьСтроку(1);
|
||
Текст.УдалитьСтроку(Текст.КоличествоСтрок());
|
||
СтрокаBase64 = Текст.ПолучитьТекст();
|
||
|
||
Попытка
|
||
ДанныеСертификата = Base64Значение(СтрокаBase64);
|
||
Исключение
|
||
Возврат Неопределено;
|
||
КонецПопытки;
|
||
|
||
Если ТипЗнч(ДанныеСертификата) <> Тип("ДвоичныеДанные") Тогда
|
||
Возврат Неопределено;
|
||
КонецЕсли;
|
||
|
||
Попытка
|
||
СертификатКриптографии = Новый СертификатКриптографии(ДанныеСертификата);
|
||
Исключение
|
||
СертификатКриптографии = Неопределено;
|
||
КонецПопытки;
|
||
|
||
Возврат СертификатКриптографии;
|
||
|
||
КонецФункции
|
||
|
||
// Только для внутреннего использования.
|
||
Процедура НастроитьПояснениеВводаПароля(Форма, ИмяЭлементаУсиленнаяЗащитаЗакрытогоКлюча = "", ИмяЭлементаПояснениеУсиленногоПароля = "") Экспорт
|
||
|
||
Если Не ЭлектроннаяПодписьСлужебныйКлиентСервер.ИнтерактивныйРежимДоступен() Тогда
|
||
Возврат;
|
||
КонецЕсли;
|
||
|
||
Если ЗначениеЗаполнено(ИмяЭлементаУсиленнаяЗащитаЗакрытогоКлюча) Тогда
|
||
Элемент = Форма.Элементы[ИмяЭлементаУсиленнаяЗащитаЗакрытогоКлюча];
|
||
Элемент.Заголовок = НСтр("ru = 'Ввод и сохранение пароля в программе'");
|
||
Элемент.Подсказка =
|
||
НСтр("ru = '- Включается интерактивный режим работы программы электронной подписи,
|
||
| при котором она запрашивает пароль и позволяет его сохранить.
|
||
|- Отключается запрос пароля в форме 1С:Предприятия.
|
||
|
|
||
|Обязательно для закрытых ключей сертификатов, для которых в ОС включена усиленная защита.'");
|
||
КонецЕсли;
|
||
|
||
Если ЗначениеЗаполнено(ИмяЭлементаПояснениеУсиленногоПароля) Тогда
|
||
Элемент = Форма.Элементы[ИмяЭлементаПояснениеУсиленногоПароля];
|
||
Элемент.Подсказка =
|
||
НСтр("ru = 'Пароль запрашивает программа электронной подписи, а не программа 1С:Предприятие,
|
||
|так как для выбранного сертификата включен режим ""Ввод и сохранение пароля в программе"".'");
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
// Обновление информационной базы.
|
||
|
||
// Обработчик конвертации данных при переходе на поддержку использования
|
||
// нескольких программ электронной подписи и шифрования в одной ИБ.
|
||
//
|
||
Процедура ПеренестиНастройкиМенеджераКриптографии() Экспорт
|
||
|
||
ПрограммаОбъект = СтараяПрограмма();
|
||
Программа = Неопределено;
|
||
|
||
НачатьТранзакцию();
|
||
Попытка
|
||
Если ПрограммаОбъект <> Неопределено Тогда
|
||
Если Не ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ() Тогда
|
||
ОбновлениеИнформационнойБазы.ЗаписатьДанные(ПрограммаОбъект);
|
||
КонецЕсли;
|
||
Программа = ПрограммаОбъект.Ссылка;
|
||
КонецЕсли;
|
||
|
||
Если Константы.ИспользоватьЭлектронныеПодписи.Получить()
|
||
И Не Константы.ИспользоватьШифрование.Получить() Тогда
|
||
|
||
МенеджерЗначения = Константы.ИспользоватьШифрование.СоздатьМенеджерЗначения();
|
||
МенеджерЗначения.Значение = Истина;
|
||
ОбновлениеИнформационнойБазы.ЗаписатьДанные(МенеджерЗначения);
|
||
КонецЕсли;
|
||
|
||
ОчиститьКонстанту(Константы.УдалитьПровайдерЭП);
|
||
ОчиститьКонстанту(Константы.УдалитьТипПровайдераЭП);
|
||
ОчиститьКонстанту(Константы.УдалитьАлгоритмПодписи);
|
||
ОчиститьКонстанту(Константы.УдалитьАлгоритмХеширования);
|
||
ОчиститьКонстанту(Константы.УдалитьАлгоритмШифрования);
|
||
ОбработатьПутиНаСерверахLinux(Программа);
|
||
ОбработатьПутиНаКлиентахLinux(Программа);
|
||
|
||
ЗафиксироватьТранзакцию();
|
||
Исключение
|
||
ОтменитьТранзакцию();
|
||
ВызватьИсключение;
|
||
КонецПопытки;
|
||
|
||
КонецПроцедуры
|
||
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
// Работа с XMLDSig
|
||
|
||
// Подписывает сообщение, подставляя в шаблон SOAP данные подписи.
|
||
//
|
||
// Параметры:
|
||
// КонвертSOAP - Строка - шаблон формируемого сообщения в формате SOAP
|
||
// ДанныеАлгоритмаПодписания - Структура:
|
||
// XPathПодписываемыйТег - Строка - запрос для получения тега подписи.
|
||
// XPathSignedInfo - Строка - запрос для получения тега подписываемой информации.
|
||
// OIDАлгоритмаХеширования - Строка - идентификатор алгоритма хеширования.
|
||
// ИмяАлгоритмаПодписи - Строка - имя алгоритма подписи.
|
||
// АлгоритмХеширования - Строка - алгоритм хеширования в конверте SOAP.
|
||
// АлгоритмПодписи - Строка - алгоритм подписи в конверте SOAP.
|
||
// СертификатКриптографии - СертификатКриптографии - используемый сертификат криптографии.
|
||
// МенеджерКриптографии - МенеджерКриптографии - используемый менеджер криптографии.
|
||
//
|
||
// Возвращаемое значение:
|
||
// Строка - шаблон SOAP, со вставленными данными подписи.
|
||
//
|
||
Функция Подписать(Знач КонвертSOAP, ДанныеАлгоритмаПодписания, СертификатКриптографии, МенеджерКриптографии) Экспорт
|
||
|
||
XPathПодписываемыйТег = ДанныеАлгоритмаПодписания.XPathПодписываемыйТег;
|
||
XPathSignedInfo = ДанныеАлгоритмаПодписания.XPathSignedInfo;
|
||
|
||
Пароль = МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу;
|
||
|
||
ОбъектКомпоненты = ОбъектВнешнейКомпонентыXMLDSig();
|
||
|
||
СвойстваКриптопровайдера = СвойстваКриптопровайдера(МенеджерКриптографии);
|
||
ОбъектКомпоненты.ПутьККриптопровайдеру = СвойстваКриптопровайдера.Путь;
|
||
|
||
КонвертSOAP = СтрЗаменить(
|
||
КонвертSOAP,
|
||
"%BinarySecurityToken%",
|
||
СертификатКриптографииBase64(СертификатКриптографии.Выгрузить()));
|
||
|
||
ПроверитьВыбратьАлгоритмПодписи(ОбъектКомпоненты,
|
||
СертификатКриптографииBase64(СертификатКриптографии.Выгрузить()),
|
||
ДанныеАлгоритмаПодписания);
|
||
|
||
DigestValue = Hash(
|
||
ОбъектКомпоненты,
|
||
C14N(ОбъектКомпоненты, КонвертSOAP, XPathПодписываемыйТег),
|
||
ДанныеАлгоритмаПодписания.OIDВыбранногоАлгоритмаХеширования,
|
||
СвойстваКриптопровайдера.Тип);
|
||
|
||
КонвертSOAP = СтрЗаменить(КонвертSOAP, "%DigestValue%", DigestValue);
|
||
КонвертSOAP = СтрЗаменить(КонвертSOAP, "%SignatureMethod%", ДанныеАлгоритмаПодписания.ВыбранныйАлгоритмПодписи);
|
||
КонвертSOAP = СтрЗаменить(КонвертSOAP, "%DigestMethod%", ДанныеАлгоритмаПодписания.ВыбранныйАлгоритмХеширования);
|
||
|
||
SignatureValue = Sign(
|
||
ОбъектКомпоненты,
|
||
C14N(ОбъектКомпоненты, КонвертSOAP, XPathSignedInfo),
|
||
СертификатКриптографии,
|
||
Пароль);
|
||
|
||
КонвертSOAP = СтрЗаменить(КонвертSOAP, "%SignatureValue%", SignatureValue);
|
||
|
||
Возврат КонвертSOAP;
|
||
|
||
КонецФункции
|
||
|
||
// В параметре возвращается сертификат, с помощью которого была произведена подпись (если сертификат включен в данные подписи).
|
||
// Если проверка подписи завершилась неудачно, генерируется исключительная ситуация.
|
||
Функция ПроверитьПодпись(Знач КонвертSOAP, ДанныеАлгоритмаПодписания, МенеджерКриптографии) Экспорт
|
||
|
||
XPathПодписываемыйТег = ДанныеАлгоритмаПодписания.XPathПодписываемыйТег;
|
||
XPathSignedInfo = ДанныеАлгоритмаПодписания.XPathSignedInfo;
|
||
|
||
ОбъектКомпоненты = ОбъектВнешнейКомпонентыXMLDSig();
|
||
|
||
СвойстваКриптопровайдера = СвойстваКриптопровайдера(МенеджерКриптографии);
|
||
ОбъектКомпоненты.ПутьККриптопровайдеру = СвойстваКриптопровайдера.Путь;
|
||
|
||
СертификатКриптографииBase64 = ЭлектроннаяПодписьСлужебныйКлиентСервер.НайтиВXML(КонвертSOAP, "wsse:BinarySecurityToken");
|
||
|
||
ПроверитьВыбратьАлгоритмПодписи(ОбъектКомпоненты, СертификатКриптографииBase64, ДанныеАлгоритмаПодписания);
|
||
|
||
ПодписьВерна = VerifySign(
|
||
ОбъектКомпоненты,
|
||
C14N(ОбъектКомпоненты, КонвертSOAP, XPathSignedInfo),
|
||
ЭлектроннаяПодписьСлужебныйКлиентСервер.НайтиВXML(КонвертSOAP, "SignatureValue"),
|
||
СертификатКриптографииBase64,
|
||
СвойстваКриптопровайдера.Тип);
|
||
|
||
DigestValue = Hash(
|
||
ОбъектКомпоненты,
|
||
C14N(ОбъектКомпоненты, КонвертSOAP, XPathПодписываемыйТег),
|
||
ДанныеАлгоритмаПодписания.OIDВыбранногоАлгоритмаХеширования,
|
||
СвойстваКриптопровайдера.Тип);
|
||
|
||
ХешСовпадает = Ложь;
|
||
Если DigestValue = ЭлектроннаяПодписьСлужебныйКлиентСервер.НайтиВXML(КонвертSOAP, "DigestValue") Тогда
|
||
ХешСовпадает = Истина;
|
||
КонецЕсли;
|
||
|
||
Если ХешСовпадает И ПодписьВерна Тогда
|
||
|
||
ДвоичныеДанные = Base64Значение(СертификатКриптографииBase64);
|
||
|
||
ДатаПодписания = ЭлектроннаяПодпись.ДатаПодписания(ДвоичныеДанные);
|
||
Если Не ЗначениеЗаполнено(ДатаПодписания) Тогда
|
||
ДатаПодписания = Неопределено;
|
||
КонецЕсли;
|
||
|
||
ВозвращаемоеЗначение = Новый Структура;
|
||
ВозвращаемоеЗначение.Вставить("Сертификат", Новый СертификатКриптографии(ДвоичныеДанные));
|
||
ВозвращаемоеЗначение.Вставить("ДатаПодписания", ДатаПодписания);
|
||
|
||
Возврат ВозвращаемоеЗначение;
|
||
|
||
Иначе
|
||
|
||
Если ПодписьВерна Тогда
|
||
ВызватьИсключение НСтр("ru = 'Подпись не верна (SignatureValue корректно, отличается DigestValue).'")
|
||
Иначе
|
||
ВызватьИсключение НСтр("ru = 'Подпись не верна (SignatureValue некорректно.'");
|
||
КонецЕсли;
|
||
|
||
КонецЕсли;
|
||
|
||
КонецФункции
|
||
|
||
Функция ОбъектВнешнейКомпонентыXMLDSig()
|
||
|
||
ОбъектКомпоненты = ОбщегоНазначения.ПодключитьКомпонентуИзМакета("XMLDSignAddIn",
|
||
"Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования.Макет.КомпонентаXMLDSig");
|
||
|
||
Если ОбъектКомпоненты = Неопределено Тогда
|
||
ВызватьИсключение НСтр("ru='Не удалось подключить внешнюю компоненту XMLDSig.'");
|
||
КонецЕсли;
|
||
|
||
Возврат ОбъектКомпоненты;
|
||
|
||
КонецФункции
|
||
|
||
Функция СвойстваКриптопровайдера(МенеджерКриптографии)
|
||
|
||
ИнформацияМодуляКриптографии = МенеджерКриптографии.ПолучитьИнформациюМодуляКриптографии();
|
||
|
||
ИмяКриптопровайдера = ИнформацияМодуляКриптографии.Имя;
|
||
ОписаниеПрограммы = ЭлектроннаяПодписьСлужебныйКлиентСервер.ОписаниеПрограммыПоИмениКриптопровайдера(ИмяКриптопровайдера,
|
||
ЭлектроннаяПодпись.ОбщиеНастройки().ОписанияПрограмм);
|
||
|
||
Если ОписаниеПрограммы = Неопределено Тогда
|
||
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не удалось определить тип криптопровайдера %1'"), ИмяКриптопровайдера);
|
||
КонецЕсли;
|
||
|
||
Свойства = Новый Структура("Тип, Путь", ОписаниеПрограммы.ТипПрограммы, "");
|
||
|
||
Если ОбщегоНазначения.ЭтоLinuxСервер() Тогда
|
||
ПутиКПрограммамНаСерверахLinux = ПутиКПрограммамНаСерверахLinux(ИмяКомпьютера());
|
||
Свойства.Путь = ПутиКПрограммамНаСерверахLinux.Получить(ОписаниеПрограммы.Ссылка);
|
||
Иначе
|
||
Свойства.Путь = "";
|
||
КонецЕсли;
|
||
|
||
Возврат Свойства;
|
||
|
||
КонецФункции
|
||
|
||
Функция GetSignOIDFromCert(ОбъектКомпоненты, СертификатКриптографииBase64)
|
||
|
||
Попытка
|
||
OIDАлгоритмаПодписи = ОбъектКомпоненты.GetSignOIDFromCert(СертификатКриптографииBase64);
|
||
Исключение
|
||
ВызватьИсключение НСтр("ru = 'Ошибка вызова метода GetSignOIDFromCert компоненты XMLDSig.'") + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
|
||
КонецПопытки;
|
||
|
||
Если OIDАлгоритмаПодписи = Неопределено Тогда
|
||
ВызватьИсключение НСтр("ru = 'Ошибка вызова метода GetSignOIDFromCert компоненты XMLDSig.'") + Символы.ПС + ОбъектКомпоненты.GetLastError();
|
||
КонецЕсли;
|
||
|
||
Возврат OIDАлгоритмаПодписи;
|
||
|
||
КонецФункции
|
||
|
||
Функция C14N(ОбъектКомпоненты, КонвертSOAP, XPath)
|
||
|
||
Попытка
|
||
КаноникализированныйТекстXML = ОбъектКомпоненты.C14N(
|
||
КонвертSOAP,
|
||
XPath);
|
||
Исключение
|
||
ВызватьИсключение НСтр("ru = 'Ошибка вызова метода C14N компоненты XMLDSig.'") + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
|
||
КонецПопытки;
|
||
|
||
Если КаноникализированныйТекстXML = Неопределено Тогда
|
||
ВызватьИсключение НСтр("ru = 'Ошибка вызова метода C14N компоненты XMLDSig.'") + Символы.ПС + ОбъектКомпоненты.GetLastError();
|
||
КонецЕсли;
|
||
|
||
Возврат КаноникализированныйТекстXML;
|
||
|
||
КонецФункции
|
||
|
||
Функция Hash(ОбъектКомпоненты, КаноникализированныйТекстXML, OIDАлгоритмаХеширования, ТипКриптопровайдера)
|
||
|
||
Попытка
|
||
DigestValue = ОбъектКомпоненты.Hash(
|
||
КаноникализированныйТекстXML,
|
||
OIDАлгоритмаХеширования,
|
||
ТипКриптопровайдера);
|
||
Исключение
|
||
ВызватьИсключение НСтр("ru = 'Ошибка вызова метода Hash компоненты XMLDSig.'") + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
|
||
КонецПопытки;
|
||
|
||
Если DigestValue = Неопределено Тогда
|
||
ВызватьИсключение НСтр("ru = 'Ошибка вызова метода Hash компоненты XMLDSig.'") + Символы.ПС + ОбъектКомпоненты.GetLastError();
|
||
КонецЕсли;
|
||
|
||
Возврат DigestValue;
|
||
|
||
КонецФункции
|
||
|
||
Функция Sign(ОбъектКомпоненты, КаноникализированныйТекстXMLSignedInfo, СертификатКриптографии, ПарольДоступаКЗакрытомуКлючу)
|
||
|
||
Попытка
|
||
SignatureValue = ОбъектКомпоненты.Sign(
|
||
КаноникализированныйТекстXMLSignedInfo,
|
||
СертификатКриптографииBase64(СертификатКриптографии.Выгрузить()),
|
||
ПарольДоступаКЗакрытомуКлючу);
|
||
Исключение
|
||
ВызватьИсключение НСтр("ru = 'Ошибка вызова метода Sign компоненты XMLDSig.'") + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
|
||
КонецПопытки;
|
||
|
||
Если SignatureValue = Неопределено Тогда
|
||
ВызватьИсключение НСтр("ru = 'Ошибка вызова метода Sign компоненты XMLDSig.'") + Символы.ПС + ОбъектКомпоненты.GetLastError();
|
||
КонецЕсли;
|
||
|
||
Возврат SignatureValue;
|
||
|
||
КонецФункции
|
||
|
||
Функция VerifySign(ОбъектКомпоненты, КаноникализированныйТекстXMLSignedInfo, SignatureValue, СертификатКриптографииBase64, ТипКриптопровайдера)
|
||
|
||
Попытка
|
||
ПодписьВерна = ОбъектКомпоненты.VerifySign(
|
||
КаноникализированныйТекстXMLSignedInfo,
|
||
SignatureValue,
|
||
СертификатКриптографииBase64,
|
||
ТипКриптопровайдера);
|
||
Исключение
|
||
ВызватьИсключение НСтр("ru = 'Ошибка вызова метода VerifySign компоненты XMLDSig.'") + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
|
||
КонецПопытки;
|
||
|
||
Если ПодписьВерна = Неопределено Тогда
|
||
ВызватьИсключение НСтр("ru = 'Ошибка вызова метода VerifySign компоненты XMLDSig.'") + Символы.ПС + ОбъектКомпоненты.GetLastError();
|
||
КонецЕсли;
|
||
|
||
Возврат ПодписьВерна;
|
||
|
||
КонецФункции
|
||
|
||
Процедура ПроверитьВыбратьАлгоритмПодписи(ОбъектКомпоненты, СертификатКриптографииBase64, ДанныеАлгоритмаПодписания)
|
||
|
||
OIDАлгоритмаПодписи = GetSignOIDFromCert(ОбъектКомпоненты, СертификатКриптографииBase64);
|
||
|
||
OIDАлгоритмовПодписи = СтрРазделить(ДанныеАлгоритмаПодписания.OIDАлгоритмаПодписи, Символы.ПС);
|
||
OIDАлгоритмовХеширования = СтрРазделить(ДанныеАлгоритмаПодписания.OIDАлгоритмаХеширования, Символы.ПС);
|
||
АлгоритмыПодписи = СтрРазделить(ДанныеАлгоритмаПодписания.АлгоритмПодписи, Символы.ПС);
|
||
АлгоритмыХеширования = СтрРазделить(ДанныеАлгоритмаПодписания.АлгоритмХеширования, Символы.ПС);
|
||
|
||
ДанныеАлгоритмаПодписания.Вставить("OIDВыбранногоАлгоритмаПодписи", Неопределено);
|
||
ДанныеАлгоритмаПодписания.Вставить("OIDВыбранногоАлгоритмаХеширования", Неопределено);
|
||
ДанныеАлгоритмаПодписания.Вставить("ВыбранныйАлгоритмПодписи", Неопределено);
|
||
ДанныеАлгоритмаПодписания.Вставить("ВыбранныйАлгоритмХеширования", Неопределено);
|
||
Для Индекс = 0 По OIDАлгоритмовПодписи.Количество() - 1 Цикл
|
||
|
||
Если OIDАлгоритмаПодписи = OIDАлгоритмовПодписи[Индекс] Тогда
|
||
|
||
ДанныеАлгоритмаПодписания.OIDВыбранногоАлгоритмаПодписи = OIDАлгоритмовПодписи[Индекс];
|
||
ДанныеАлгоритмаПодписания.OIDВыбранногоАлгоритмаХеширования = OIDАлгоритмовХеширования[Индекс];
|
||
ДанныеАлгоритмаПодписания.ВыбранныйАлгоритмПодписи = АлгоритмыПодписи[Индекс];
|
||
ДанныеАлгоритмаПодписания.ВыбранныйАлгоритмХеширования = АлгоритмыХеширования[Индекс];
|
||
|
||
Прервать;
|
||
|
||
КонецЕсли;
|
||
|
||
КонецЦикла;
|
||
|
||
Если Не ЗначениеЗаполнено(ДанныеАлгоритмаПодписания.OIDВыбранногоАлгоритмаПодписи) Тогда
|
||
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
|
||
НСтр("ru = 'Алгоритм подписи сертификата криптографии отличается от алгоритма %1.'"),
|
||
ДанныеАлгоритмаПодписания.ИмяАлгоритмаПодписи);
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
// Вспомогательные процедуры и функции.
|
||
|
||
|
||
// Для процедуры обновления ПеренестиНастройкиМенеджераКриптографии.
|
||
Процедура ОчиститьКонстанту(Константа)
|
||
|
||
Если Не ЗначениеЗаполнено(Константа.Получить()) Тогда
|
||
Возврат;
|
||
КонецЕсли;
|
||
|
||
МенеджерЗначения = Константа.СоздатьМенеджерЗначения();
|
||
МенеджерЗначения.Значение = Неопределено;
|
||
ОбновлениеИнформационнойБазы.ЗаписатьДанные(МенеджерЗначения);
|
||
|
||
КонецПроцедуры
|
||
|
||
// Для процедуры обновления ПеренестиНастройкиМенеджераКриптографии.
|
||
Процедура ОбработатьПутиНаСерверахLinux(Программа)
|
||
|
||
// Обработка серверных путей
|
||
НаборЗаписей = РегистрыСведений.ПутиКПрограммамЭлектроннойПодписиИШифрованияНаСерверахLinux.СоздатьНаборЗаписей();
|
||
НаборЗаписей.Отбор.Программа.Установить(Справочники.ПрограммыЭлектроннойПодписиИШифрования.ПустаяСсылка());
|
||
НаборЗаписей.Прочитать();
|
||
|
||
Если НаборЗаписей.Количество() = 0 Тогда
|
||
Возврат;
|
||
КонецЕсли;
|
||
|
||
Если ЗначениеЗаполнено(Программа) Тогда
|
||
НаборЗаписейПрограммы = РегистрыСведений.ПутиКПрограммамЭлектроннойПодписиИШифрованияНаСерверахLinux.СоздатьНаборЗаписей();
|
||
НаборЗаписейПрограммы.Отбор.Программа.Установить(Программа);
|
||
НаборЗаписейПрограммы.Прочитать();
|
||
Таблица = НаборЗаписейПрограммы.Выгрузить(, "ИмяКомпьютера, ПутьКПрограмме");
|
||
Отбор = Новый Структура("ИмяКомпьютера, ПутьКПрограмме");
|
||
|
||
Для каждого Запись Из НаборЗаписей Цикл
|
||
ЗаполнитьЗначенияСвойств(Отбор, Запись);
|
||
Строки = Таблица.НайтиСтроки(Отбор);
|
||
Если Строки.Количество() = 0 Тогда
|
||
НоваяЗапись = НаборЗаписейПрограммы.Добавить();
|
||
ЗаполнитьЗначенияСвойств(НоваяЗапись, Запись);
|
||
НоваяЗапись.Программа = Программа;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
Если НаборЗаписейПрограммы.Модифицированность() Тогда
|
||
ОбновлениеИнформационнойБазы.ЗаписатьДанные(НаборЗаписейПрограммы);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
|
||
НаборЗаписей.Очистить();
|
||
ОбновлениеИнформационнойБазы.ЗаписатьДанные(НаборЗаписей);
|
||
|
||
КонецПроцедуры
|
||
|
||
// Для процедуры обновления ПеренестиНастройкиМенеджераКриптографии.
|
||
Процедура ОбработатьПутиНаКлиентахLinux(Программа)
|
||
|
||
// Обработка клиентских путей
|
||
ПользователиИБ = ПользователиИнформационнойБазы.ПолучитьПользователей();
|
||
КлючПодсистемы = "ЭЦП"; // Не заменять на "ЭП". Используется для обратной совместимости.
|
||
СтарыйКлючНастроек = "ПутьМодуляКриптографии";
|
||
НовыйКлючНастроек = "ПутиКПрограммамЭлектроннойПодписиИШифрования";
|
||
Для каждого ПользовательИБ Из ПользователиИБ Цикл
|
||
Путь = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить(КлючПодсистемы, СтарыйКлючНастроек,,,
|
||
ПользовательИБ.Имя);
|
||
Если Не ЗначениеЗаполнено(Путь) Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
Настройки = Новый Соответствие;
|
||
Настройки.Вставить(Программа, Путь);
|
||
ОбщегоНазначения.ХранилищеОбщихНастроекСохранить(КлючПодсистемы, НовыйКлючНастроек, Настройки,,
|
||
ПользовательИБ.Имя)
|
||
КонецЦикла;
|
||
|
||
КонецПроцедуры
|
||
|
||
// Для процедуры обновления ПеренестиНастройкиМенеджераКриптографии.
|
||
Функция СтараяПрограмма()
|
||
|
||
ИмяПрограммы = СокрЛП(Константы.УдалитьПровайдерЭП.Получить());
|
||
ТипПрограммы = Константы.УдалитьТипПровайдераЭП.Получить();
|
||
|
||
Запрос = Новый Запрос;
|
||
Запрос.Текст =
|
||
"ВЫБРАТЬ ПЕРВЫЕ 1
|
||
| ИСТИНА КАК ЗначениеИстина
|
||
|ИЗ
|
||
| РегистрСведений.ПутиКПрограммамЭлектроннойПодписиИШифрованияНаСерверахLinux КАК Пути
|
||
|ГДЕ
|
||
| Пути.Программа = ЗНАЧЕНИЕ(Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования.ПустаяСсылка)";
|
||
|
||
Если Не ЗначениеЗаполнено(ИмяПрограммы)
|
||
И Не ЗначениеЗаполнено(ТипПрограммы)
|
||
И Запрос.Выполнить().Пустой() Тогда
|
||
|
||
Возврат Неопределено;
|
||
КонецЕсли;
|
||
|
||
Запрос = Новый Запрос;
|
||
Запрос.УстановитьПараметр("ИмяПрограммы", ИмяПрограммы);
|
||
Запрос.УстановитьПараметр("ТипПрограммы", ТипПрограммы);
|
||
Запрос.Текст =
|
||
"ВЫБРАТЬ
|
||
| Программы.Ссылка КАК Ссылка
|
||
|ИЗ
|
||
| Справочник.ПрограммыЭлектроннойПодписиИШифрования КАК Программы
|
||
|ГДЕ
|
||
| Программы.ИмяПрограммы = &ИмяПрограммы
|
||
| И Программы.ТипПрограммы = &ТипПрограммы";
|
||
|
||
РезультатЗапроса = Запрос.Выполнить();
|
||
Если РезультатЗапроса.Пустой() Тогда
|
||
ПрограммаОбъект = Справочники.ПрограммыЭлектроннойПодписиИШифрования.СоздатьЭлемент();
|
||
ПрограммаОбъект.Наименование = ИмяПрограммы;
|
||
ПрограммаОбъект.ИмяПрограммы = ИмяПрограммы;
|
||
ПрограммаОбъект.ТипПрограммы = ТипПрограммы;
|
||
Иначе
|
||
ПрограммаОбъект = РезультатЗапроса.Выгрузить()[0].Ссылка.ПолучитьОбъект();
|
||
КонецЕсли;
|
||
|
||
ПрограммаОбъект.АлгоритмПодписи = Константы.УдалитьАлгоритмПодписи.Получить();
|
||
ПрограммаОбъект.АлгоритмХеширования = Константы.УдалитьАлгоритмХеширования.Получить();
|
||
ПрограммаОбъект.АлгоритмШифрования = Константы.УдалитьАлгоритмШифрования.Получить();
|
||
|
||
Возврат ПрограммаОбъект;
|
||
|
||
КонецФункции
|
||
|
||
// Для процедуры ОбновитьСписокСертификатов.
|
||
Процедура ОбработатьДобавленныеСертификаты(ТаблицаСвойствСертификатов, КромеУжеДобавленных, ОтборПоОрганизации = Неопределено)
|
||
|
||
Запрос = Новый Запрос;
|
||
Запрос.УстановитьПараметр("Отпечатки", ТаблицаСвойствСертификатов.Скопировать(, "Отпечаток"));
|
||
Запрос.Текст =
|
||
"ВЫБРАТЬ
|
||
| Отпечатки.Отпечаток
|
||
|ПОМЕСТИТЬ Отпечатки
|
||
|ИЗ
|
||
| &Отпечатки КАК Отпечатки
|
||
|;
|
||
|
|
||
|////////////////////////////////////////////////////////////////////////////////
|
||
|ВЫБРАТЬ
|
||
| Сертификаты.Отпечаток,
|
||
| Сертификаты.Наименование КАК Представление,
|
||
| ЛОЖЬ КАК ЭтоЗаявление,
|
||
| Сертификаты.Организация
|
||
|ИЗ
|
||
| Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования КАК Сертификаты
|
||
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Отпечатки КАК Отпечатки
|
||
| ПО Сертификаты.Отпечаток = Отпечатки.Отпечаток";
|
||
|
||
Если Метаданные.Обработки.Найти("ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата") <> Неопределено Тогда
|
||
ОбработкаЗаявлениеНаВыпускНовогоКвалифицированногоСертификата =
|
||
ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(
|
||
"Обработка.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата");
|
||
ОбработкаЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.ДополнитьЗапросПриДобавленииСертификатов(
|
||
Запрос.Текст);
|
||
КонецЕсли;
|
||
|
||
Выборка = Запрос.Выполнить().Выбрать();
|
||
|
||
Пока Выборка.Следующий() Цикл
|
||
Строка = ТаблицаСвойствСертификатов.Найти(Выборка.Отпечаток, "Отпечаток");
|
||
Если КромеУжеДобавленных Тогда
|
||
Если Строка <> Неопределено Тогда // Защита от ошибки в данных (дубли сертификатов).
|
||
ТаблицаСвойствСертификатов.Удалить(Строка);
|
||
КонецЕсли;
|
||
ИначеЕсли ЗначениеЗаполнено(ОтборПоОрганизации) Тогда
|
||
Если Строка <> Неопределено И Выборка.Организация <> ОтборПоОрганизации Тогда // Защита от ошибки в данных (дубли сертификатов).
|
||
ТаблицаСвойствСертификатов.Удалить(Строка);
|
||
КонецЕсли;
|
||
Иначе
|
||
Строка.Представление = Выборка.Представление;
|
||
Строка.ЭтоЗаявление = Выборка.ЭтоЗаявление;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
|
||
КонецПроцедуры
|
||
|
||
// Для процедуры ОбновитьСписокСертификатов.
|
||
Процедура ОбновитьЗначение(СтароеЗначение, НовоеЗначение, ПропускатьНеопределенныеЗначения = Ложь)
|
||
|
||
Если НовоеЗначение = Неопределено И ПропускатьНеопределенныеЗначения Тогда
|
||
Возврат;
|
||
КонецЕсли;
|
||
|
||
Если СтароеЗначение <> НовоеЗначение Тогда
|
||
СтароеЗначение = НовоеЗначение;
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
// Для процедуры СохраненныеСвойстваСертификата.
|
||
Процедура ЗаполнитьРеквизит(СохраненныеСвойства, ПараметрыРеквизитов, ИмяРеквизита)
|
||
|
||
Если ПараметрыРеквизитов.Свойство(ИмяРеквизита)
|
||
И ПараметрыРеквизитов[ИмяРеквизита].ЗначениеЗаполнения <> Неопределено Тогда
|
||
|
||
СохраненныеСвойства[ИмяРеквизита] = ПараметрыРеквизитов[ИмяРеквизита].ЗначениеЗаполнения;
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
// Для процедуры НастроитьФормуПодписанияШифрованияРасшифровки.
|
||
Процедура ЗаполнитьОтборОтпечатков(Форма)
|
||
|
||
Параметры = Форма.Параметры;
|
||
|
||
Отбор = Новый Соответствие;
|
||
|
||
Если ТипЗнч(Параметры.СертификатыШифрования) = Тип("Массив") Тогда
|
||
Описания = Новый Соответствие;
|
||
Отпечатки = Новый Соответствие;
|
||
ПредставленияОтпечатков = Новый Соответствие;
|
||
|
||
Для каждого Описание Из Параметры.СертификатыШифрования Цикл
|
||
Если Описания[Описание] <> Неопределено Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
Описания.Вставить(Описание, Истина);
|
||
Сертификаты = СертификатыШифрованияИзОписания(Описание);
|
||
|
||
Для каждого Свойства Из Сертификаты Цикл
|
||
Значение = Отпечатки[Свойства.Отпечаток];
|
||
Значение = ?(Значение = Неопределено, 1, Значение + 1);
|
||
Отпечатки.Вставить(Свойства.Отпечаток, Значение);
|
||
ПредставленияОтпечатков.Вставить(Свойства.Отпечаток, Свойства.Представление);
|
||
КонецЦикла;
|
||
КонецЦикла;
|
||
КоличествоЭлементовДанных = Параметры.СертификатыШифрования.Количество();
|
||
Для каждого КлючИЗначение Из Отпечатки Цикл
|
||
Если КлючИЗначение.Значение = КоличествоЭлементовДанных Тогда
|
||
Отбор.Вставить(КлючИЗначение.Ключ, ПредставленияОтпечатков[КлючИЗначение.Ключ]);
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
|
||
ИначеЕсли Параметры.СертификатыШифрования <> Неопределено Тогда
|
||
|
||
Сертификаты = СертификатыШифрованияИзОписания(Параметры.СертификатыШифрования);
|
||
Для каждого Свойства Из Сертификаты Цикл
|
||
Отбор.Вставить(Свойства.Отпечаток, Свойства.Представление);
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
|
||
Форма.ОтборОтпечатков = ПоместитьВоВременноеХранилище(Отбор, Форма.УникальныйИдентификатор);
|
||
|
||
КонецПроцедуры
|
||
|
||
// Для процедуры ЗаполнитьОтборОтпечатков.
|
||
Функция СертификатыШифрованияИзОписания(Описание)
|
||
|
||
Если ТипЗнч(Описание) = Тип("Строка") Тогда
|
||
Возврат ПолучитьИзВременногоХранилища(Описание);
|
||
КонецЕсли;
|
||
|
||
Сертификаты = Новый Массив;
|
||
|
||
УстановитьПривилегированныйРежим(Истина);
|
||
|
||
Запрос = Новый Запрос;
|
||
Запрос.Текст =
|
||
"ВЫБРАТЬ
|
||
| СертификатыШифрования.Представление,
|
||
| СертификатыШифрования.Отпечаток,
|
||
| СертификатыШифрования.Сертификат
|
||
|ИЗ
|
||
| РегистрСведений.СертификатыШифрования КАК СертификатыШифрования
|
||
|ГДЕ
|
||
| СертификатыШифрования.ЗашифрованныйОбъект = &ЗашифрованныйОбъект";
|
||
|
||
Запрос.УстановитьПараметр("ЗашифрованныйОбъект", Описание);
|
||
|
||
РезультатЗапроса = Запрос.Выполнить();
|
||
|
||
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
|
||
|
||
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
|
||
СвойстваСертификата = Новый Структура("Отпечаток, Представление, Сертификат");
|
||
ЗаполнитьЗначенияСвойств(СвойстваСертификата, ВыборкаДетальныеЗаписи);
|
||
СвойстваСертификата.Сертификат = СвойстваСертификата.Сертификат.Получить();
|
||
Сертификаты.Добавить(СвойстваСертификата);
|
||
КонецЦикла;
|
||
|
||
Возврат Сертификаты;
|
||
|
||
КонецФункции
|
||
|
||
Функция ДвоичныеДанныеСтроки(ДанныеСтроки)
|
||
|
||
ВременныйФайл = ПолучитьИмяВременногоФайла();
|
||
|
||
ЗаписьТекста = Новый ЗаписьТекста(ВременныйФайл, КодировкаТекста.UTF8);
|
||
ЗаписьТекста.Записать(ДанныеСтроки);
|
||
ЗаписьТекста.Закрыть();
|
||
|
||
ДвоичныеДанныеСертификата = Новый ДвоичныеДанные(ВременныйФайл);
|
||
|
||
УдалитьФайлы(ВременныйФайл);
|
||
|
||
Возврат ДвоичныеДанныеСертификата;
|
||
|
||
КонецФункции
|
||
|
||
// Для процедур НастроитьФормуПодписанияШифрованияРасшифровки, СертификатПриИзмененииНаСервере.
|
||
|
||
Процедура ЗаполнитьСуществующиеСертификатыПользователя(СписокВыбора, ОтпечаткиСертификатовНаКлиенте,
|
||
ОтборСертификатов, ОтборОтпечатков = Неопределено)
|
||
|
||
СписокВыбора.Очистить();
|
||
|
||
Если ЭлектроннаяПодпись.СоздаватьЭлектронныеПодписиНаСервере() Тогда
|
||
|
||
МенеджерКриптографии = МенеджерКриптографии("ПолучениеСертификатов", Ложь);
|
||
|
||
Если МенеджерКриптографии <> Неопределено Тогда
|
||
ТипХранилища = ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты;
|
||
МассивСертификатов = МенеджерКриптографии.ПолучитьХранилищеСертификатов(ТипХранилища).ПолучитьВсе();
|
||
|
||
ЭлектроннаяПодписьСлужебныйКлиентСервер.ДобавитьОтпечаткиСертификатов(
|
||
ОтпечаткиСертификатовНаКлиенте, МассивСертификатов, ДобавкаВремени(), ТекущаяДатаСеанса());
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
|
||
Если ИспользоватьЭлектроннуюПодписьВМоделиСервиса() Тогда
|
||
МодульХранилищеСертификатов = ОбщегоНазначения.ОбщийМодуль("ХранилищеСертификатов");
|
||
МассивСертификатов = МодульХранилищеСертификатов.Получить("ПерсональныеСертификаты");
|
||
|
||
ЭлектроннаяПодписьСлужебныйКлиентСервер.ДобавитьОтпечаткиСертификатов(
|
||
ОтпечаткиСертификатовНаКлиенте, МассивСертификатов, ДобавкаВремени(), ТекущаяДатаСеанса());
|
||
КонецЕсли;
|
||
|
||
ОтборПоОрганизации = Ложь;
|
||
|
||
Если ТипЗнч(ОтборСертификатов) = Тип("СписокЗначений") Тогда
|
||
Если ОтборСертификатов.Количество() > 0 Тогда
|
||
ТекущийСписок = Новый СписокЗначений;
|
||
Для каждого ЭлементСписка Из ОтборСертификатов Цикл
|
||
Свойства = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(
|
||
ЭлементСписка.Значение, "Ссылка, Наименование, Отпечаток, Пользователь");
|
||
|
||
Если ОтпечаткиСертификатовНаКлиенте.Найти(Свойства.Отпечаток) <> Неопределено Тогда
|
||
ТекущийСписок.Добавить(Свойства.Ссылка, Свойства.Наименование,
|
||
Свойства.Пользователь = Пользователи.АвторизованныйПользователь());
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
Для Каждого ЭлементСписка Из ТекущийСписок Цикл
|
||
Если ЭлементСписка.Пометка Тогда
|
||
СписокВыбора.Добавить(ЭлементСписка.Значение, ЭлементСписка.Представление);
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
Для Каждого ЭлементСписка Из ТекущийСписок Цикл
|
||
Если Не ЭлементСписка.Пометка Тогда
|
||
СписокВыбора.Добавить(ЭлементСписка.Значение, ЭлементСписка.Представление);
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
Возврат;
|
||
КонецЕсли;
|
||
ИначеЕсли Метаданные.ОпределяемыеТипы.Организация.Тип.СодержитТип(ТипЗнч(ОтборСертификатов)) Тогда
|
||
ОтборПоОрганизации = Истина;
|
||
КонецЕсли;
|
||
|
||
Если ОтборОтпечатков <> Неопределено Тогда
|
||
Отбор = ПолучитьИзВременногоХранилища(ОтборОтпечатков);
|
||
Для каждого Отпечаток Из ОтпечаткиСертификатовНаКлиенте Цикл
|
||
Если Отбор[Отпечаток] = Неопределено Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
СписокВыбора.Добавить(Отпечаток, Отбор[Отпечаток]);
|
||
КонецЦикла;
|
||
Запрос = Новый Запрос;
|
||
Запрос.Параметры.Вставить("Отпечатки", СписокВыбора.ВыгрузитьЗначения());
|
||
Запрос.Текст =
|
||
"ВЫБРАТЬ
|
||
| Сертификаты.Ссылка КАК Ссылка,
|
||
| Сертификаты.Наименование КАК Наименование,
|
||
| Сертификаты.Отпечаток
|
||
|ИЗ
|
||
| Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования КАК Сертификаты
|
||
|ГДЕ
|
||
| Сертификаты.Отпечаток В(&Отпечатки)";
|
||
Выборка = Запрос.Выполнить().Выбрать();
|
||
Пока Выборка.Следующий() Цикл
|
||
ЭлементСписка = СписокВыбора.НайтиПоЗначению(Выборка.Отпечаток);
|
||
Если ЭлементСписка <> Неопределено Тогда
|
||
ЭлементСписка.Значение = Выборка.Ссылка;
|
||
ЭлементСписка.Представление = Выборка.Наименование;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
СписокВыбора.СортироватьПоПредставлению();
|
||
Возврат;
|
||
КонецЕсли;
|
||
|
||
Запрос = Новый Запрос;
|
||
Запрос.УстановитьПараметр("Пользователь", Пользователи.ТекущийПользователь());
|
||
Запрос.Параметры.Вставить("Отпечатки", ОтпечаткиСертификатовНаКлиенте);
|
||
Запрос.Текст =
|
||
"ВЫБРАТЬ
|
||
| Сертификаты.Ссылка КАК Ссылка,
|
||
| Сертификаты.Наименование КАК Наименование
|
||
|ИЗ
|
||
| Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования КАК Сертификаты
|
||
|ГДЕ
|
||
| Сертификаты.Программа <> ЗНАЧЕНИЕ(Справочник.ПрограммыЭлектроннойПодписиИШифрования.ПустаяСсылка)
|
||
| И Сертификаты.Пользователь = &Пользователь
|
||
| И Сертификаты.Отозван = ЛОЖЬ
|
||
| И Сертификаты.Отпечаток В(&Отпечатки)
|
||
| И ИСТИНА
|
||
|
|
||
|УПОРЯДОЧИТЬ ПО
|
||
| Наименование";
|
||
|
||
Если ОтборПоОрганизации Тогда
|
||
Запрос.Текст = СтрЗаменить(Запрос.Текст, "ИСТИНА", "Сертификаты.Организация = &Организация");
|
||
Запрос.УстановитьПараметр("Организация", ОтборСертификатов);
|
||
КонецЕсли;
|
||
|
||
Выборка = Запрос.Выполнить().Выбрать();
|
||
Пока Выборка.Следующий() Цикл
|
||
СписокВыбора.Добавить(Выборка.Ссылка, Выборка.Наименование);
|
||
КонецЦикла;
|
||
|
||
КонецПроцедуры
|
||
|
||
Процедура ЗаполнитьДополнительныеСвойстваСертификата(Форма)
|
||
|
||
Если Не ЗначениеЗаполнено(Форма.Сертификат) Тогда
|
||
Возврат;
|
||
КонецЕсли;
|
||
|
||
ЗначенияРеквизитов = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Форма.Сертификат,
|
||
"УсиленнаяЗащитаЗакрытогоКлюча, Отпечаток, Программа,
|
||
|ДействителенДо, ПользовательОповещенОСрокеДействия, ДанныеСертификата");
|
||
|
||
Попытка
|
||
ДвоичныеДанныеСертификата = ЗначенияРеквизитов.ДанныеСертификата.Получить();
|
||
Сертификат = Новый СертификатКриптографии(ДвоичныеДанныеСертификата);
|
||
Исключение
|
||
ИнформацияОбОшибке = ИнформацияОбОшибке();
|
||
Сертификат = Форма.Сертификат;
|
||
Форма.Сертификат = Неопределено;
|
||
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
|
||
НСтр("ru = 'При получении данных сертификата ""%1""
|
||
|из информационной базы возникла ошибка:
|
||
|%2'"),
|
||
Сертификат,
|
||
КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
|
||
КонецПопытки;
|
||
|
||
Форма.СертификатАдрес = ПоместитьВоВременноеХранилище(ДвоичныеДанныеСертификата, Форма.УникальныйИдентификатор);
|
||
|
||
Форма.СертификатОтпечаток = ЗначенияРеквизитов.Отпечаток;
|
||
Форма.СертификатПрограмма = ЗначенияРеквизитов.Программа;
|
||
Форма.ВыполнятьВМоделиСервиса = ЗначенияРеквизитов.Программа.ЭтоПрограммаОблачногоСервиса;
|
||
Форма.СертификатДействителенДо = ЗначенияРеквизитов.ДействителенДо;
|
||
Форма.СертификатУсиленнаяЗащитаЗакрытогоКлюча = ЗначенияРеквизитов.УсиленнаяЗащитаЗакрытогоКлюча;
|
||
|
||
Форма.ОповеститьОбОкончанииСрокаДействия =
|
||
Не ЗначенияРеквизитов.ПользовательОповещенОСрокеДействия
|
||
И ДобавитьМесяц(ТекущаяДатаСеанса(), 1) > Форма.СертификатДействителенДо;
|
||
|
||
Форма.СертификатНаСервереОписаниеОшибки = Новый Структура;
|
||
|
||
Если Не ЭлектроннаяПодпись.СоздаватьЭлектронныеПодписиНаСервере() Тогда
|
||
Возврат;
|
||
КонецЕсли;
|
||
|
||
ПолучитьСертификатПоОтпечатку(Форма.СертификатОтпечаток,
|
||
Истина, Ложь, Форма.СертификатПрограмма, Форма.СертификатНаСервереОписаниеОшибки);
|
||
|
||
КонецПроцедуры
|
||
|
||
// Для функции МенеджерКриптографии.
|
||
Функция НовыйМенеджерКриптографии(Программа, Ошибки, ИмяКомпьютера)
|
||
|
||
ОписанияПрограмм = ЭлектроннаяПодписьСлужебныйКлиентСервер.МенеджерКриптографииОписанияПрограмм(
|
||
Программа, Ошибки, ЭлектроннаяПодпись.ОбщиеНастройки().ОписанияПрограмм);
|
||
|
||
Если ОписанияПрограмм = Неопределено Тогда
|
||
Возврат Неопределено;
|
||
КонецЕсли;
|
||
|
||
ЭтоLinux = ОбщегоНазначения.ЭтоLinuxСервер();
|
||
|
||
Если ЭтоLinux Тогда
|
||
ПутиКПрограммамНаСерверахLinux = ПутиКПрограммамНаСерверахLinux(ИмяКомпьютера);
|
||
Иначе
|
||
ПутиКПрограммамНаСерверахLinux = Неопределено;
|
||
КонецЕсли;
|
||
|
||
Менеджер = Неопределено;
|
||
Для каждого ОписаниеПрограммы Из ОписанияПрограмм Цикл
|
||
|
||
СвойстваПрограммы = ЭлектроннаяПодписьСлужебныйКлиентСервер.МенеджерКриптографииСвойстваПрограммы(
|
||
ОписаниеПрограммы, ЭтоLinux, Ошибки, Истина, ПутиКПрограммамНаСерверахLinux);
|
||
|
||
Если СвойстваПрограммы = Неопределено Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
|
||
Попытка
|
||
ИнформацияМодуля = СредстваКриптографии.ПолучитьИнформациюМодуляКриптографии(
|
||
СвойстваПрограммы.ИмяПрограммы,
|
||
СвойстваПрограммы.ПутьКПрограмме,
|
||
СвойстваПрограммы.ТипПрограммы);
|
||
Исключение
|
||
ЭлектроннаяПодписьСлужебныйКлиентСервер.МенеджерКриптографииДобавитьОшибку(Ошибки,
|
||
ОписаниеПрограммы.Ссылка, КраткоеПредставлениеОшибки(ИнформацияОбОшибке()),
|
||
Истина, Истина, Истина);
|
||
Продолжить;
|
||
КонецПопытки;
|
||
|
||
Если ИнформацияМодуля = Неопределено Тогда
|
||
ЭлектроннаяПодписьСлужебныйКлиентСервер.МенеджерКриптографииПрограммаНеНайдена(
|
||
ОписаниеПрограммы, Ошибки, Истина);
|
||
|
||
Менеджер = Неопределено;
|
||
Продолжить;
|
||
КонецЕсли;
|
||
|
||
Если Не ЭтоLinux Тогда
|
||
ИмяПрограммыПолученное = ИнформацияМодуля.Имя;
|
||
|
||
ИмяПрограммыСовпадает = ЭлектроннаяПодписьСлужебныйКлиентСервер.МенеджерКриптографииИмяПрограммыСовпадает(
|
||
ОписаниеПрограммы, ИмяПрограммыПолученное, Ошибки, Истина);
|
||
|
||
Если Не ИмяПрограммыСовпадает Тогда
|
||
Менеджер = Неопределено;
|
||
Продолжить;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
|
||
Попытка
|
||
Менеджер = Новый МенеджерКриптографии(
|
||
СвойстваПрограммы.ИмяПрограммы,
|
||
СвойстваПрограммы.ПутьКПрограмме,
|
||
СвойстваПрограммы.ТипПрограммы);
|
||
Исключение
|
||
ЭлектроннаяПодписьСлужебныйКлиентСервер.МенеджерКриптографииДобавитьОшибку(Ошибки,
|
||
ОписаниеПрограммы.Ссылка, КраткоеПредставлениеОшибки(ИнформацияОбОшибке()),
|
||
Истина, Истина, Истина);
|
||
Продолжить;
|
||
КонецПопытки;
|
||
|
||
АлгоритмыУстановлены = ЭлектроннаяПодписьСлужебныйКлиентСервер.МенеджерКриптографииАлгоритмыУстановлены(
|
||
ОписаниеПрограммы, Менеджер, Ошибки);
|
||
|
||
Если Не АлгоритмыУстановлены Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
|
||
Прервать; // Требуемый менеджер криптографии получен.
|
||
КонецЦикла;
|
||
|
||
Возврат Менеджер;
|
||
|
||
КонецФункции
|
||
|
||
Функция ИспользоватьЭлектроннуюПодписьВМоделиСервиса() Экспорт
|
||
|
||
Если Не ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.РаботаВМоделиСервиса.ЭлектроннаяПодписьВМоделиСервиса") Тогда
|
||
Возврат Ложь;
|
||
КонецЕсли;
|
||
|
||
МодульЭлектроннаяПодписьВМоделиСервисаКлиентСервер =
|
||
ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодписьВМоделиСервисаКлиентСервер");
|
||
|
||
Возврат МодульЭлектроннаяПодписьВМоделиСервисаКлиентСервер.ИспользованиеВозможно();
|
||
|
||
КонецФункции
|
||
|
||
Функция ПутиКПрограммамНаСерверахLinux(ИмяКомпьютера)
|
||
|
||
Запрос = Новый Запрос;
|
||
Запрос.УстановитьПараметр("ИмяКомпьютера", ИмяКомпьютера);
|
||
Запрос.Текст =
|
||
"ВЫБРАТЬ
|
||
| ПутиКПрограмме.Программа,
|
||
| ПутиКПрограмме.ПутьКПрограмме
|
||
|ИЗ
|
||
| РегистрСведений.ПутиКПрограммамЭлектроннойПодписиИШифрованияНаСерверахLinux КАК ПутиКПрограмме
|
||
|ГДЕ
|
||
| ПутиКПрограмме.ИмяКомпьютера = &ИмяКомпьютера";
|
||
|
||
ПутиКПрограммамНаСерверахLinux = Новый Соответствие;
|
||
Выборка = Запрос.Выполнить().Выбрать();
|
||
Пока Выборка.Следующий() Цикл
|
||
ПутиКПрограммамНаСерверахLinux.Вставить(Выборка.Программа, Выборка.ПутьКПрограмме);
|
||
КонецЦикла;
|
||
|
||
Возврат ПутиКПрограммамНаСерверахLinux;
|
||
|
||
КонецФункции
|
||
|
||
// Для функции ПолучитьСоответствиеФайловИПодписей.
|
||
Функция НайтиИменаФайловПодписей(ИмяФайлаДанных, ИменаФайловПодписей)
|
||
|
||
ИменаПодписей = Новый Массив;
|
||
|
||
СтруктураИмени = ОбщегоНазначенияКлиентСервер.РазложитьПолноеИмяФайла(ИмяФайлаДанных);
|
||
ИмяБезРасширения = СтруктураИмени.ИмяБезРасширения;
|
||
|
||
Для Каждого ИмяФайлаПодписи Из ИменаФайловПодписей Цикл
|
||
Если СтрНайти(ИмяФайлаПодписи, ИмяБезРасширения) > 0 Тогда
|
||
ИменаПодписей.Добавить(ИмяФайлаПодписи);
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
|
||
Для Каждого ИмяФайлаПодписи Из ИменаПодписей Цикл
|
||
ИменаФайловПодписей.Удалить(ИменаФайловПодписей.Найти(ИмяФайлаПодписи));
|
||
КонецЦикла;
|
||
|
||
Возврат ИменаПодписей;
|
||
|
||
КонецФункции
|
||
|
||
// Для функций Подписать и Sign.
|
||
|
||
// Преобразует сертификат криптографии в корректно отформатированную строку в формате Base64.
|
||
//
|
||
// Параметры:
|
||
// ДанныеСертификата - ДвоичныеДанные - данные сертификата, которые подлежат преобразованию.
|
||
//
|
||
// Возвращаемое значение:
|
||
// Строка - преобразованный в строку в формате Base64 сертификат.
|
||
//
|
||
Функция СертификатКриптографииBase64(ДанныеСертификата)
|
||
|
||
СтрокаBase64 = Base64Строка(ДанныеСертификата);
|
||
|
||
Значение = СтрЗаменить(СтрокаBase64, Символы.ВК, "");
|
||
Значение = СтрЗаменить(Значение, Символы.ПС, "");
|
||
|
||
Возврат Значение;
|
||
|
||
КонецФункции
|
||
|
||
#КонецОбласти |