В корпоративных информационных системах нередко возникает требование двухфакторного подтверждения критически важных операций. Например, при проведении финансовых или отгрузочных документов требуется убедиться, что действие выполняет именно уполномоченный сотрудник, имеющий при себе аппаратный носитель (токен, смарт-карту или специализированную флешку с сертификатом). Разберем, как правильно реализовать подобную проверку в среде веб-клиента 1С:Предприятия.
Проанализируем распространенную ошибку: попытку напрямую прочитать файл сертификата или уникальный серийный номер съемного диска из кода формы. При работе через веб-клиент код выполняется внутри браузера, чья модель безопасности жестко блокирует прямой доступ к подключенным USB-накопителям и файловой системе клиентского компьютера без явных действий пользователя через диалог выбора файлов.
Правильным и надежным решением является использование штатного механизма криптографии и электронной подписи (ЭП) платформы 1С:Предприятие. Вместо проверки наличия файла выполняется операция подписания данных документа закрытым ключом, размещенным на аппаратном носителе.
МенеджерКриптографии вызывается процедура асинхронного подписания данных.Чтобы платформа 1С в браузере могла взаимодействовать с криптопровайдером и аппаратными ключами, необходимо выполнить следующие настройки на клиентских местах:
Разберем по шагам, как написать программный код для подписи документа на клиенте и проверки сертификата на сервере.
Посмотрим на пример клиентской процедуры, которая вызывается перед проведением документа в веб-клиенте. Все криптографические операции в интерфейсе выполняются только через асинхронные методы:
&НаКлиенте
Асинх Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
Если ПараметрыЗаписи.РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
Отказ = Истина; // Прерываем стандартную запись для выполнения асинхронной проверки
// Получаем строку данных документа для формирования подписи
ДанныеДляПодписи = ПолучитьДанныеДляПодписиНаСервере();
ДвоичныеДанные = ПолучитьДвоичныеДанныеИзСтроки(ДанныеДляПодписи);
// Инициализируем менеджер криптографии
Менеджер = Новый МенеджерКриптографии;
Попытка
// Получаем сертификат текущего пользователя
Сертификат = Ждать ПолучитьСертификатПользователяАсинх(Менеджер);
Если Сертификат = Неопределено Тогда
ПоказатьПредупреждение(, "Не обнаружен персональный сертификат на носителе!");
Возврат;
КонецЕсли;
// Выполняем подписание данных закрытым ключом с токена
Подпись = Ждать Менеджер.ПодписатьАсинх(ДвоичныеДанные, Сертификат);
// Отправляем подпись и сертификат на сервер для валидации и проведения
РезультатПроверки = ПроверитьИПровестиНаСервере(ДвоичныеДанные, Подпись, Сертификат);
Если РезультатПроверки Тогда
ПараметрыЗаписи.Вставить("ПроверкаПройдена", Истина);
ЭтаФорма.Записать(ПараметрыЗаписи);
Иначе
ПоказатьПредупреждение(, "Ошибка проверки электронной подписи или несоответствие владельца ключа!");
КонецЕсли;
Исключение
ПоказатьПредупреждение(, "Ошибка криптографии: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецПроцедуры
Теперь рассмотрим серверную часть, где выполняется проверка соответствия отпечатка сертификата текущему авторизованному пользователю информационной базы:
&НаСервере
Функция ПроверитьИПровестиНаСервере(ДвоичныеДанные, ДанныеПодписи, СертификатКлиента)
Менеджер = Новый МенеджерКриптографии;
// 1. Проверяем математическую корректность подписи
Попытка
Менеджер.ПроверитьПодпись(ДвоичныеДанные, ДанныеПодписи, СертификатКлиента);
Исключение
Возврат Ложь;
КонецПопытки;
// 2. Проверяем привязку сертификата к текущему пользователю ИБ
ОтпечатокСертификата = СертификатКлиента.Отпечаток;
ТекущийПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
ОтпечатокВБазе = ПолучитьОтпечатокСертификатаПользователя(ТекущийПользовательИБ);
Если ОтпечатокСертификата <> ОтпечатокВБазе Тогда
Возврат Ложь;
КонецЕсли;
Возврат Истина;
КонецФункции
Если в конфигурации внедрена Библиотека стандартных подсистем (БСП), рекомендуется использовать готовую подсистему ЭлектроннаяПодпись. Она включает в себя:
Пользователи.Если развертывание криптопровайдеров и драйверов токенов на рабочих местах сотрудников затруднено технически, в качестве альтернативы можно использовать аппаратные или программные генераторы одноразовых паролей (TOTP / Google Authenticator). При проведении документа система открывает модальное окно запроса 6-значного кода, который генерируется на физическом брелоке сотрудника, и валидирует его на сервере без необходимости взаимодействия браузера с USB-портами.