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

Общая схема решения приведена на картинке.
Компоненты на клиенте.
На сервере используем модифицированный openssl + wrapper для ASP.NET. Использование openssl дает возможность перейти на сертифицированное СКЗИ МагПро КриптоПакет 2.1 без особых изменений серверной части.
Описание протокола, по которому происходит подпись.
Теперь о технических средствах.
Серверная библиотека-wrapper над openssl имеет следующее API:
Как видим, данные функции достаточно легко вызвать из ASP.NET (и не только).
На клиенте подпись хэша осуществляется последовательностью вызовов Рутокен Плагин:
Хэш и сертификат отправляются на сервер.
Решение является несложным как для разработчика, так и для конечного пользователя.
Обычно требуется подпись по ГОСТ Р 34.10-2001, с применением цифровых сертификатов X.509. При этом саму подпись потом удобно хранить на сервере в формате CMS detached.
Сразу хочется отметить, что задача это решена достаточно давно (КриптоПро CSP, CAPICOM, etc). Но есть нюансы, которые делают такое решение не всегда удобным. Для одного из проектов мы предложили решение по подписи файлов, которое реально облегчило жизнь конечным пользователям и техподдержке. О нем ниже.

Общая схема решения приведена на картинке.
Компоненты на клиенте.
- Рутокен ЭЦП в качестве аппаратного СКЗИ
- Рутокен Плагин для поддержки Рутокен ЭЦП в браузере + поддержка цифровых сертификатов
На сервере используем модифицированный openssl + wrapper для ASP.NET. Использование openssl дает возможность перейти на сертифицированное СКЗИ МагПро КриптоПакет 2.1 без особых изменений серверной части.
Описание протокола, по которому происходит подпись.
- Загрузка документа на сервер стандартными средствами браузера (или формирование документа на сервере, как часто бывает)
- Вычисление хэш-суммы от документа на сервере по ГОСТ Р 34.11-94 с помощью openssl
- Отсылка вычисленной хэш-суммы на клиент
- Подпись по ГОСТ Р 34.10-2001 хэш-суммы на клиенте закрытым ключом, связанным с сертификатом
- Отправка подписи и сертификата на сервер
- Проверка подписи
- Упаковка подписи и сертификата в формат CMS detached
Теперь о технических средствах.
Серверная библиотека-wrapper над openssl имеет следующее API:
- Функция вычисления хэш-суммы
unsigned char* HashData(unsigned char* buffer, size_t size);
- Функция формирования CMS detached
char* CreateSignedCMSDetached(unsigned char* signature, const char* cert);
- Функция проверки подписи не универсальна и реализована только для данного проекта, поэтому ее здесь описывать не буду
Как видим, данные функции достаточно легко вызвать из ASP.NET (и не только).
На клиенте подпись хэша осуществляется последовательностью вызовов Рутокен Плагин:
- Пользователь выбирает сертификат
- Найти закрытый ключ по сертификату
getKeyByCertificate(deviceId, certId, resultCallback, errorCallback) → {string}
- Получить “тело” сертификата для отправки на сервер
getCertificate(deviceId, certId, resultCallback, errorCallback) → {string}
- Подписать хэш с помощью закрытого ключа
rawSign(deviceId, keyId, data, options, resultCallback, errorCallback) → {string}
Возвращает подпись ГОСТ Р 34.10-2001 в hex от переданного хэша
Хэш и сертификат отправляются на сервер.
Решение является несложным как для разработчика, так и для конечного пользователя.