Ряд проектов требуют подписи файлов любого формата (например, конкурсной документации в формате PDF) при загрузке их на сервер.
Обычно требуется подпись по ГОСТ Р 34.10-2001 с использованием цифровых сертификатов X.509. В этом случае саму подпись можно удобно хранить на сервере в отдельном формате CMS. Сразу хочу отметить, что данная проблема решена довольно давно (CryptoPro CSP, CAPICOM и т.д.).
Но есть нюансы, которые делают такое решение не всегда удобным.
Для одного из проектов мы предложили решение для подписи файлов, которое действительно облегчило жизнь конечным пользователям и технической поддержке.
О нем ниже.
Общая схема решения представлена на рисунке.
Компоненты на клиенте.
- Рутокен ЭПроцессор в качестве аппаратного обеспечения СКЗИ
- Плагин Рутокен для поддержки Рутокена — CPU в браузере + поддержка цифровых сертификатов
Описание протокола, используемого для подписи.
- Загрузка документа на сервер стандартными средствами браузера (или генерация документа на сервере, как это часто бывает)
- Вычисление хеш-суммы документа на сервере по ГОСТ Р 34.11-94 с помощью openssl
- Отправка рассчитанной хэш-суммы клиенту
- Подписание по ГОСТ Р 34.10-2001 хеш-суммы на клиенте закрытым ключом, связанным с сертификатом
- Отправка подписи и сертификата на сервер
- Проверка подписи
- Упаковка подписи и сертификата в отдельном формате CMS
Серверная библиотека-оболочка OpenSSL имеет следующий API:
- Функция хеш-суммы беззнаковый символ* HashData (буфер беззнакового символа*, размер size_t);
- Функция автономной генерации CMS char* CreateSignedCMSDetached(подпись без знака char*, const char* cert);
- Функция проверки подписи не универсальна и реализована только для этого проекта, поэтому описывать ее здесь не буду.
На клиенте хэш-подпись осуществляется последовательностью обращений к Плагину Рутокен:
- Пользователь выбирает сертификат
- Найти закрытый ключ из сертификата getKeyByCertificate(deviceId, certId, resultCallback, errorCallback) → {строка}
- Получите «тело» сертификата для отправки на сервер.
getCertificate(deviceId, certId, resultCallback, errorCallback) → {строка}
- Подпишите хэш, используя закрытый ключ rawSign(deviceId, keyId, данные, параметры, resultCallback, errorCallback) → {строка}
Возвращает подпись ГОСТ Р 34.10-2001 в шестнадцатеричном формате из переданного хэша.
Решение простое как для разработчика, так и для конечного пользователя.
Теги: #цифровая подпись #CMS #цифровая подпись рутокен #openssl #информационная безопасность
-
Халдейн, Джон Скотт
19 Oct, 24 -
Экономия Энергии В Linux На Платформе Intel
19 Oct, 24 -
Итальянская Забастовка Роботов
19 Oct, 24 -
Каратель Мороженого!
19 Oct, 24 -
Комментарии На Хабрахабре.
19 Oct, 24 -
Китай Создал Ос
19 Oct, 24