Как стать автором
Обновить
71.61

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

Время на прочтение2 мин
Количество просмотров16K
В ряде проектов требуется подписывать файлы произвольного формата (например, конкурсную документацию в формате PDF) при загрузке их на сервер.
Обычно требуется подпись по ГОСТ Р 34.10-2001, с применением цифровых сертификатов X.509. При этом саму подпись потом удобно хранить на сервере в формате CMS detached.
Сразу хочется отметить, что задача это решена достаточно давно (КриптоПро CSP, CAPICOM, etc). Но есть нюансы, которые делают такое решение не всегда удобным. Для одного из проектов мы предложили решение по подписи файлов, которое реально облегчило жизнь конечным пользователям и техподдержке. О нем ниже.





Общая схема решения приведена на картинке.
Компоненты на клиенте.
  1. Рутокен ЭЦП в качестве аппаратного СКЗИ
  2. Рутокен Плагин для поддержки Рутокен ЭЦП в браузере + поддержка цифровых сертификатов

На сервере используем модифицированный openssl + wrapper для ASP.NET. Использование openssl дает возможность перейти на сертифицированное СКЗИ МагПро КриптоПакет 2.1 без особых изменений серверной части.

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


Теперь о технических средствах.
Серверная библиотека-wrapper над openssl имеет следующее API:
  1. Функция вычисления хэш-суммы
    unsigned char* HashData(unsigned char* buffer, size_t size);
  2. Функция формирования CMS detached
    char* CreateSignedCMSDetached(unsigned char* signature, const char* cert);
  3. Функция проверки подписи не универсальна и реализована только для данного проекта, поэтому ее здесь описывать не буду


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

На клиенте подпись хэша осуществляется последовательностью вызовов Рутокен Плагин:
  1. Пользователь выбирает сертификат
  2. Найти закрытый ключ по сертификату
    getKeyByCertificate(deviceId, certId, resultCallback, errorCallback) → {string}
  3. Получить “тело” сертификата для отправки на сервер
    getCertificate(deviceId, certId, resultCallback, errorCallback) → {string}
  4. Подписать хэш с помощью закрытого ключа
    rawSign(deviceId, keyId, data, options, resultCallback, errorCallback) → {string}
    Возвращает подпись ГОСТ Р 34.10-2001 в hex от переданного хэша


Хэш и сертификат отправляются на сервер.
Решение является несложным как для разработчика, так и для конечного пользователя.
Теги:
Хабы:
Всего голосов 21: ↑11 и ↓10+1
Комментарии115

Публикации

Информация

Сайт
aktiv-company.ru
Дата регистрации
Дата основания
Численность
201–500 человек
Местоположение
Россия