Pull to refresh
72.54

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

Reading time2 min
Views15K
В ряде проектов требуется подписывать файлы произвольного формата (например, конкурсную документацию в формате 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 от переданного хэша


Хэш и сертификат отправляются на сервер.
Решение является несложным как для разработчика, так и для конечного пользователя.
Tags:
Hubs:
Total votes 21: ↑11 and ↓10+1
Comments115

Articles

Information

Website
aktiv-company.ru
Registered
Founded
1994
Employees
101–200 employees
Location
Россия