Работа с криптографией в веб-клиенте 1С существенно отличается от работы в тонком или толстом клиенте. Основная сложность заключается в том, что браузер работает в изолированной среде ("песочнице"), и прямое взаимодействие с криптографическими модулями (CSP) операционной системы невозможно без специальных расширений и асинхронных методов. В данной статье мы подробно разберем, как правильно инициализировать МенеджерКриптографии, подготовить среду и выполнить подписание файла в браузере.
Прежде чем приступать к написанию кода, проанализируем необходимые условия, без которых работа с криптографией в веб-клиенте будет прерываться ошибками получения контекста модуля. Рассмотрим основные компоненты:
Рассмотрим ситуацию, когда нам нужно подписать локальный файл. В веб-клиенте мы не можем использовать синхронные методы, поэтому весь процесс строится на цепочке оповещений (callback). Выясним, какие параметры нам понадобятся для инициализации менеджера.
Для начала создадим процедуру, которая запускает процесс. Обратите внимание на использование объекта ОписаниеОповещения. Все процедуры-обработчики в веб-клиенте должны иметь признак Экспорт, иначе платформа не сможет к ним обратиться после завершения асинхронной операции.
&НаКлиенте
Процедура ПодписатьФайл(ПутьКФайлу, СертификатОбъект)
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ПодписанныйФайл", ПутьКФайлу + ".sig");
ДополнительныеПараметры.Вставить("ИсходныйФайл", ПутьКФайлу);
ДополнительныеПараметры.Вставить("Сертификат", СертификатОбъект);
// Подготавливаем финальное оповещение, которое сработает после завершения всей цепочки
ОписаниеОповещения = Новый ОписаниеОповещения("ПодписаниеЗавершение", ЭтотОбъект, ДополнительныеПараметры);
ДополнительныеПараметры.Вставить("ОповещениеЗавершения", ОписаниеОповещения);
// Подготавливаем обратный вызов для инициализации менеджера
ОбратныйВызов = Новый ОписаниеОповещения("ИнициализацияЗавершениеПодпись", ЭтотОбъект, ДополнительныеПараметры);
Криптография = Новый МенеджерКриптографии;
// Параметры инициализации зависят от версии ГОСТ и провайдера
// Для КриптоПро ГОСТ Р 34.10-2001 обычно используется тип 75
// Для КриптоПро ГОСТ Р 34.10-2012 используется тип 80 или 81
ИмяМодуля = "Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider";
ТипПровайдера = 80;
Криптография.НачатьИнициализацию(ОбратныйВызов, ИмяМодуля, "", ТипПровайдера, ИспользованиеИнтерактивногоРежимаКриптографии.Использовать);
КонецПроцедуры
После того как менеджер криптографии инициализирован, нам необходимо вызвать метод подписания. На этом этапе часто возникает ошибка "получения контекста". Проанализируем причину: она может быть вызвана неверным указанием имени модуля или типа провайдера. Если вы не уверены в точных данных провайдера, можно попробовать передать пустые строки — в некоторых случаях платформа 1С через расширение сможет определить нужный модуль автоматически на основе выбранного сертификата.
&НаКлиенте
Процедура ИнициализацияЗавершениеПодпись(Менеджер, ДополнительныеПараметры) Экспорт
// Если требуется программный ввод пароля, его можно установить здесь:
// Менеджер.ПарольДоступаКЗакрытомуКлючу = "ваш_пароль";
// Создаем оповещение, которое сработает после того, как файл будет физически подписан
Оповещение = Новый ОписаниеОповещения("ПослеПодписания", ЭтотОбъект, ДополнительныеПараметры);
// Выполняем подписание
Менеджер.НачатьПодписывание(Оповещение,
ДополнительныеПараметры.ИсходныйФайл,
ДополнительныеПараметры.ПодписанныйФайл,
ДополнительныеПараметры.Сертификат);
КонецПроцедуры
Разберем, что происходит после успешного (или неуспешного) формирования подписи. Метод НачатьПодписывание вернет управление в процедуру ПослеПодписания. Здесь мы можем выполнить дополнительные действия, например, сообщить пользователю об успехе или передать файл на сервер.
&НаКлиенте
Процедура ПослеПодписания(ИмяФайлаРезультата, ДополнительныеПараметры) Экспорт
// ИмяФайлаРезультата содержит путь к созданному .sig файлу
ПоказатьОповещениеПользователя("Успех", , "Файл успешно подписан: " + ИмяФайлаРезультата);
// Вызываем финальное оповещение, если оно было предусмотрено логикой
ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеЗавершения, ИмяФайлаРезультата);
КонецПроцедуры
&НаКлиенте
Процедура ПодписаниеЗавершение(Результат, ДополнительныеПараметры) Экспорт
// Здесь логика окончательного завершения процесса
КонецПроцедуры
Проанализируем ситуацию со сменой государственных стандартов. Если ваш сертификат выпущен недавно (после 2018-2019 года), он почти наверняка использует алгоритм ГОСТ Р 34.10-2012.
Для таких сертификатов использование типа 75 приведет к ошибке контекста. Посмотрим на актуальные значения параметров:
"Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider".Рассмотрим еще одно ограничение: работа с прямыми путями к файлам в веб-клиенте может быть заблокирована политиками безопасности Chrome или Firefox. Если код выше выдает ошибку доступа к файлу, рекомендуется изменить алгоритм:
НачатьПомещениеФайлаНаСервер для получения объекта ДвоичныеДанные.НачатьПодписывание не строковый путь, а объект ДвоичныеДанные.Совет: Всегда проверяйте наличие пароля на контейнер закрытого ключа. В веб-клиенте, если ИспользованиеИнтерактивногоРежимаКриптографии.Использовать включено, должно появиться стандартное окно ввода пароля от КриптоПро. Если оно не появляется, проверьте, не заблокированы ли всплывающие окна вашим браузером (ищите значок блокировки в адресной строке).