Подписание Файлов Через Браузер

Ряд проектов требуют подписи файлов любого формата (например, конкурсной документации в формате PDF) при загрузке их на сервер.

Обычно требуется подпись по ГОСТ Р 34.10-2001 с использованием цифровых сертификатов X.509. В этом случае саму подпись можно удобно хранить на сервере в отдельном формате CMS. Сразу хочу отметить, что данная проблема решена довольно давно (CryptoPro CSP, CAPICOM и т.д.).

Но есть нюансы, которые делают такое решение не всегда удобным.

Для одного из проектов мы предложили решение для подписи файлов, которое действительно облегчило жизнь конечным пользователям и технической поддержке.

О нем ниже.



Подписание файлов через браузер

Общая схема решения представлена на рисунке.

Компоненты на клиенте.

  1. Рутокен ЭПроцессор в качестве аппаратного обеспечения СКЗИ
  2. Плагин Рутокен для поддержки Рутокена — CPU в браузере + поддержка цифровых сертификатов
На сервере мы используем модифицированную обертку openssl+ для ASP.NET. Использование openssl дает возможность перейти на сертифицированный СКЗИ MagPro CryptoPackage 2.1 без особых изменений серверной части.

Описание протокола, используемого для подписи.

  1. Загрузка документа на сервер стандартными средствами браузера (или генерация документа на сервере, как это часто бывает)
  2. Вычисление хеш-суммы документа на сервере по ГОСТ Р 34.11-94 с помощью openssl
  3. Отправка рассчитанной хэш-суммы клиенту
  4. Подписание по ГОСТ Р 34.10-2001 хеш-суммы на клиенте закрытым ключом, связанным с сертификатом
  5. Отправка подписи и сертификата на сервер
  6. Проверка подписи
  7. Упаковка подписи и сертификата в отдельном формате CMS
Теперь о технических средствах.

Серверная библиотека-оболочка OpenSSL имеет следующий API:

  1. Функция хеш-суммы беззнаковый символ* HashData (буфер беззнакового символа*, размер size_t);
  2. Функция автономной генерации CMS char* CreateSignedCMSDetached(подпись без знака char*, const char* cert);
  3. Функция проверки подписи не универсальна и реализована только для этого проекта, поэтому описывать ее здесь не буду.

Как видите, эти функции довольно легко вызвать из ASP.NET (и не только).

На клиенте хэш-подпись осуществляется последовательностью обращений к Плагину Рутокен:

  1. Пользователь выбирает сертификат
  2. Найти закрытый ключ из сертификата getKeyByCertificate(deviceId, certId, resultCallback, errorCallback) → {строка}
  3. Получите «тело» сертификата для отправки на сервер.

    getCertificate(deviceId, certId, resultCallback, errorCallback) → {строка}

  4. Подпишите хэш, используя закрытый ключ rawSign(deviceId, keyId, данные, параметры, resultCallback, errorCallback) → {строка} Возвращает подпись ГОСТ Р 34.10-2001 в шестнадцатеричном формате из переданного хэша.

Хэш и сертификат отправляются на сервер.

Решение простое как для разработчика, так и для конечного пользователя.

Теги: #цифровая подпись #CMS #цифровая подпись рутокен #openssl #информационная безопасность

Вместе с данным постом часто просматривают: