Как реализовать формы на сайте с возможностью электронной подписи? — Хабр Q&A

Что потребуется для подписания электронного документа?

Получить электронную подпись

Публикуем документ, подписанный электронной цифровой подписью, на сайте образовательной организации

1. Переходим систему администрирования вашего сайта на конструкторе сайтов «Нубекс», заходим в раздел «Образовательная организация» => «Документы»:

2. Загрузим, например, Устав образовательной организации:

3. Нажимаем кнопку «Загрузить файлы»:

4. После загрузки файла:

1) видим в системе загруженный файл;

2) видим уведомление об отсутствии подписи;

3) нажимаем кнопку «Загрузить подпись»:

5. Выбираем файл подписи с расширением .sig именно того документа, который мы подписывали ранее и загружаем на сайт. Система уведомляет о том, что подпись корректна:

Внимание!!! Система осуществляет проверку подлинности подписи. Если файл, который вы подписывали, был изменен вами или кем то еще, то система не примет подпись и выдаст ошибку. На скриншоте ниже видно, что система сигнализирует о том, что подпись не верна, хотя в исходный документ был добавлен только пробел:

Отображение документа, подписанного электронной цифровой подписью, на сайте образовательной организации

Как это отображается документ, подписанный электронной цифровой подписью, на сайте. Открываем сайт, заходим в раздел «Сведения об образовательной организации», далее «Документы» и видим загруженный файл, а рядом отображается значок электронной цифровой подписи.

Вариант 2. установить отдельную программу для создания подписи

Чтобы подписывать документы любого формата (*rar, *.jpeg и *.png,*.ppt, видео, базы данных и т.д.), можно установить на компьютер специальную программу — например, КриптоАРМ.

У программы есть несколько версий, которые отличаются функциональностью. Базовой версией КриптоАРМ Старт с минимумом возможностей можно пользоваться бесплатно. У всех платных версий есть тестовый период, в течение которого будут доступны все возможности. Когда это время истечет, потребуется приобрести лицензию, чтобы продолжить пользоваться этой версией.

Подписать документ можно из главного окна программы или из контекстного меню файла. Алгоритм подписания отличается в зависимости от этих вариантов, но в любом случае выбирайте пункт «Подписать» и следуйте инструкциям. Программа предложит вам выбрать:

  • Количество файлов, которые нужно подписать: можно подписать несколько файлов или папку с документами.
  • Формат подписи: присоединенная или отсоединенная. В первом случае подпись будет встроена в файл, а во втором будет создана в отдельном файле с расширением *.sig.
  • Сертификат, которым нужно подписать документ.

Что учесть при использовании программы:

  • В бесплатной версии можно поставить только базовую КЭП (без проверки времени подписания документа и статуса сертификата). Но проверить можно и усовершенствованную подпись (со статусом сертификата и временем подписания документа).

Получить электронную подпись

Вариант 3. воспользоваться веб-сервисами

Можно подписать документ любого формата, не устанавливая на компьютер специальных программ, — например, в веб-сервисе Контур.Крипто.

Это бесплатная программа, которая позволяет создать и проверить электронную подпись, зашифровать и расшифровать электронный файл. Можно подписать не только отдельный файл, но и пакет файлов или архивов. Можно создать подпись документа двумя и более лицами.

Работать в программе можно после регистрации и автоматической установки на компьютер программного обеспечения для криптографических операций. У программы интуитивно понятный интерфейс. Чтобы подписать электронный документ, необходимо:

Для документов формата pdf

Для создания и проверки электронной подписи в программах Adobe Acrobat, Adobe Reader и Adobe LiveCycle ES есть отдельный модуль КриптоПро PDF.

КриптоПро PDF прилагается бесплатно при совместном использовании с программой Adobe Reader. В остальных программах также есть тестовый период, по истечении которого нужно приобрести лицензию.

Прежде чем вставить электронную подпись в документе PDF, необходимо установить и настроить Acrobat Reader DC или Adobe Acrobat Pro для работы с программой КриптоПро PDF.

После настройки чтобы поставить подпись, выберете в меню документа пункт «Работа с сертификатами», затем нажмите «Подписание». Программа предложит выбрать нужную подпись, среди установленных и место в документе, где будет располагаться подпись. После этого можно завершить подписание документа.

Получить электронную подпись

Для документов формата word и excel

Чаще всего требуется подписать документ в формате Word:

  • трудовой или хозяйственный договор,
  • иск в арбитраж,
  • заявление в вуз и т.д.

Штатная функция пакета Microsoft Office «Подписать документ» не позволяет создать подпись, которая придает электронному документу юридическую силу. Чтобы создать такую подпись в Word или Excel, необходимо установить на свой компьютер специальный программный модуль, который добавит такую возможность, — например, КриптоПро Office Signature.

Читайте также:  Анкета на визу в Болгарию: образец заполнения в 2021 году

Это платная программа, использовать все возможности бесплатно можно только в тестовый период. После загрузки и установки плагина на компьютере можно подписывать документы по такому алгоритму:

  1. В главном меню документа выберите пункт «Сервис» и перейдите в «Параметры». В появившемся окне выберите вкладку «Безопасность» и нажмите кнопку «Цифровые подписи».

  2. В этом окне выберите нужный сертификат электронной подписи из тех, что установлены на компьютере.

  3. С его помощью создайте для документа электронную подпись: нажмите «Подписать» и введите пароль ключевого контейнера.

Что учесть при использовании плагина:

  • Алгоритм подписания отличается в разных версиях Word.
  • Если создать подпись в одной версии программы, а проверять ее в другой, результат проверки может быть некорректным.
  • Документ, подписанный с помощью КриптоПро Office Signature, можно открыть и проверить даже на компьютере, где эта программа не установлена.

Получить электронную подпись

Как подписать документы на сайте с помощью эцп?

Добрый день!
Есть сайт на котором пользователь может загружать документы и при необходимости может их подписать электронной цифровой подписью. Какие существуют варианты реализации подобного?

Почитал статьи на эту тему, из них понятно, что помимо установки модулей на сервер у самого пользователя должны быть установлены специальные программы. Этот вариант не совсем устраивает, его лучше оставить на крайний случай. Есть ли другие способы?

На сайте госуслуг кажется есть возможность подписать документ(при подаче 3-ндфл, вроде) без установки сторонних программ, может кто в курсе как это реализовано?

У кого-нибудь есть опыт реализации подобных задач?

Как реализовать формы на сайте с возможностью электронной подписи?

Почитайте в конце концов про ассиметричную криптографию и PKI.

В общем в кратце так, хотите с клиентами юридически значимый электронный документооборот — подписываете с каждым соглашение, что стороны соглашаются считать собственноручной электронную подпись сделанную с помощью такой-то технологии.

Технология при этом может быть различная. Довольно простой и легкий вариант — PGP, это не PKI, но довольно близко.

Каждая сторона генерирует себе пару ключей (секретный/публичный), публичный ключ передается противоположной стороне. С помощью соответствующего софта файлы подписываются и отправляются второй стороне.

Тут важно, что каждый из участников сам генерирует себе ключи и приватный ключ никому никогда не передается.

Именно по такому принципу работают большинство банков, только они обязаны использовать отечественную сертифицированную криптографию (CryptoPro, КриптоКом …).

Если перейти на PKI, то добавляется еще один персонаж — центр сертификации (ЦС). Каждая сторона, после того как сгенерирует ключ отправляет запрос на сертификат в ЦС и получает от него сертификат. Сертификат, это по сути публичный ключ, подписанный на ключе ЦС с различными ограничениями. Например есть ограничение на срок использования сертификата.

Точно не уверен, но вроде как в нашей стране нельзя использовать западную криптуху по закону, поэтому лучше сразу ориентироваться на отечественный софт. Например не плохой вариант CryptoPro КриптоАРМ. Отечественная стоит денег.
Если спросите, а что насчет SSL — там же сплошь западные алгоритмы, не сертифицированные, отвечу — в законе есть специальные оговорки про это, смысл в том, что если не возможно удалить из ПО поддержку западных алгоритмов, то можно. Но применительно к документообороту это не притянуть.

Конфигурирование openssl

Openssl поддерживает российские криптоалгоритмы, начиная с версии 1.0. Для того, чтобы их использовать, в openssl требуется подгружать engine gost. В большинстве дистрибутивов openssl эта библиотека присутствует. Чтобы engine подгружалась, можно прописать ее в конфигурационном файле openssl:

[openssl_def]
engines = engine_section

[engine_section]
gost  = gost_section

[gost_section]
engine_id  = gost
default_algorithms = ALL

Если конфигурационный файл openssl не расположен в стандартном месте, то путь к нему можно задать через переменную окружения OPENSSL_CONF.

Другим вариантом подгрузки engine gost является ее передача в параметрах командной строки утилиты openssl.

Если engine gost не расположена в стандартном месте, то через переменную окружения OPENSSL_ENGINES можно задать путь к директории, в которой openssl будет ее искать.

Читайте также:  Как аннулировать эцп при увольнении. Электронную подпись аннулируют по трем причинам Аннулирование электронной подписи

Для получения информации о том, успешен ли был вызов утилиты openssl или нет, с возможностью уточнения ошибки, требуется парсить stdout и stderror. В конце статьи приведена ссылка на PHP-скрипт, который использует данную утилиту.

Теперь перейдем к реализации законченных пользовательских сценариев.

Поиск подключенных устройств

Любой клиентский сценарий начинается с поиска подключенных к компьютеру USB-устройств Рутокен. В контексте данной статьи акцент делается на устройство Рутокен ЭЦП.

var devices = Array();

try 
{
    devices = plugin.enumerateDevices();
}
catch (error) 
{
    console.log(error);
}

При этом возвращается список идентификаторов подключенных устройств. Идентификатор представляет собой число, связанное с номером слота, к которому подключено устройство. При повторном перечислении это число может отличаться для одного и того же устройства.

Рутокен Плагин определяет все подключенные к компьютеру USВ-устройства Рутокен ЭЦП, Рутокен PINPad, Рутокен WEB. Поэтому следующим шагом следует определить тип устройства.

Полезные ссылки

Данные ссылки могут быть полезны разработчикам инфосистем с поддержкой ЭЦП на базе Рутокен Плагин и openssl:

Демосистема Рутокен ПлагинWEB-сервис генерации ключей, формирования запросов, управления сертификатами, формирования шаблонов запросов на сертификаты Документация на Рутокен ПлагинДокументация по использованию утилиты openssl с российскими крипталгоритмамиПример скрипта на PHP, использующего утилиту openssl

Получение информации об устройстве

Для определения типа устройства следует использовать функцию

с параметром TOKEN_INFO_DEVICE_TYPE. Значение этой константы содержится в объекте плагина.

var type;

try
{  
  type = plugin.getDeviceInfo(deviceId, plugin.TOKEN_INFO_DEVICE_TYPE);
}
catch (error) 
{
    console.log(error);
}

switch (type) 
{
    case plugin.TOKEN_TYPE_UNKNOWN:
        message = "Неизвестное устройство";
        break;
    case plugin.TOKEN_TYPE_RUTOKEN_ECP:
        message = "Рутокен ЭЦП";
        break;
    case plugin.TOKEN_TYPE_RUTOKEN_WEB:
        message = "Рутокен Web";
        break;
    case plugin.TOKEN_TYPE_RUTOKEN_PINPAD_2:
        message = "Рутокен PINPad";
        break;
}

Также с помощью функции getDeviceInfo можно получить:

Работа с ключевыми парами гост р 34.10-2001

1. Для получения декрипторов ключевых пар, хранящихся на устройстве, требуется ввод PIN-кода. Следует понимать, что само значение закрытого ключ получено быть не может, так как ключ является неизвлекаемым.

var keys = Array();

try
{   
    plugin.login(deviceId, "12345678");
    keys = plugin.enumerateKeys(deviceId, null);
}
catch (error) 
{
    console.log(error);
}

2. Для генерации ключевой пары требуется ввод PIN-кода. При генерации ключа параметры могут быть выбраны из набора:

  • A: id-GostR3410-2001-CryptoPro-A-ParamSet
  • B: id-GostR3410-2001-CryptoPro-B-ParamSet
  • C: id-GostR3410-2001-CryptoPro-C-ParamSet
  • XA: id-GostR3410-2001-CryptoPro-XchA-ParamSet
  • XB: id-GostR3410-2001-CryptoPro-XchB-ParamSet

Пример генерации ключевой пары ГОСТ Р 34.10-2001:

var options = {};
var keyId;

try 
{
    keyId = plugin.generateKeyPair(deviceId, "A",  null, options);
}
catch (error) 
{
    console.log(error);
}

3. С помощью функции deleteKeyPair ключевая пара может быть удалена с токена.

Работа с сертификатами

1. На токене могут храниться 3 категории сертификатов:

Расшифрование данных, полученных с сервера, на клиенте

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

Этот дескриптор является уникальным и неизменным и потому может быть сохранен в учетной записи пользователя на сервере. Кроме того, дескриптор ключа пользователя может быть получен явным образом, путем вызова функции getKeyByCertificate.

Шифрование данных на сервере для клиента:

Сертификат выдается при регистрации в системе

  • Получаем список подключенных к компьютеру устройств Рутокен ЭЦП
  • Генерируем ключевую пару ГОСТ Р 34.10-2001 на выбранном Рутокен ЭЦП
  • Cоздаем запрос PKCS#10 на сертификат для сгенерированной ключевой пары
  • Отправляем запрос на сервер
  • На сервере создаем сертификат, привязываем к аккаунту (сам сертификат или его дескриптор). Следует отметить, что дескрипторы сертификатов, полученные при вызове функции enumerateCertificates, являются уникальными и неизменными
  • Отправляем сертификат на клиент
  • На клиенте визуализируем полученный сертификат
  • Импортируем полученный сертификат в Рутокен ЭЦП

Последовательность вызовов в клиентском скрипте будет следующей:

Далее запрос отправляется на сервер, где на его основе выдается сертификат.Для этого на сервере должен быть установлен и правильно сконфигурирован openssl версии от 1.0 и развернут функционал УЦ.

Читайте также:  Копировальщики ключей от домофона и шлагбаума: самостоятельно и легально дублируем собственный ключ (Aliexpress) / Подборки, перечисления, топ-10, и так далее / iXBT Live

1. Генерация улюча УЦ:

openssl genpkey -engine gost -algorithm GOST2001 -pkeyopt paramset:A -out ca.key

После этого в файле ca.key будет создан закрытый ключ

2. Создание самоподписанного сертификата УЦ:

openssl req -engine gost -x509 -new -key ca.key -out ca.crt


После ввода необходимой информации об издателе в файле ca.crt будет создан сертификат УЦ.

Сертификат уже имеется на токене, выдан внешним уц

Ключевая пара при этом должна быть создана в формате, совместимом с библиотекой rtPKCS11ECP для Рутокен ЭЦП.

Последовательность вызовов на клиенте:
Как реализовать формы на сайте с возможностью электронной подписи? — Хабр Q&A

Подпись получается в base64-формате. При проверке ее на сервере с помощью openssl подпись следует обрамить заголовками, чтобы сделать из нее PEM. Выглядеть подобная подпись будет примерно так:

-----BEGIN CMS-----
MIIDUQYJKoZIhvcNAQcCoIIDQjCCAz4CAQExDDAKBgYqhQMCAgkFADCBygYJKoZI
hvcNAQcBoIG8BIG5PCFQSU5QQURGSUxFIFVURjg PFY 0JLRi9C/0L7Qu9C90LjR
gtGMINCw0YPRgtC10L3RgtC40YTQuNC60LDRhtC40Y4/PCE c2VydmVyLXJhbmRv
bS1kYXRhZTI6ZGE6MmM6MDU6MGI6MzY6MjU6MzQ6YzM6NDk6Nzk6Mzk6YmI6MmY6
YzU6Mzc6ZGI6MzA6MTQ6NDQ6ODM6NjY6Njk6NmI6OWY6YTU6MDk6MzQ6YmY6YzQ6
NzY6YzmgggGeMIIBmjCCAUegAwIBAgIBATAKBgYqhQMCAgMFADBUMQswCQYDVQQG
EwJSVTEPMA0GA1UEBxMGTW9zY293MSIwIAYDVQQKFBlPT08gIkdhcmFudC1QYXJr
LVRlbGVjb20iMRAwDgYDVQQDEwdUZXN0IENBMB4XDTE0MTIyMjE2NTEyNVoXDTE1
MTIyMjE2NTEyNVowEDEOMAwGA1UEAxMFZmZmZmYwYzAcBgYqhQMCAhMwEgYHKoUD
AgIjAQYHKoUDAgIeAQNDAARADKA/O1Zw50PzMpcNkWnW39mAJcTehAhkQ2Vg7bHk
IwIdf7zPe2PxHyAr6lH stqdACK6sFYmkZ58cBjzL0WBwaNEMEIwJQYDVR0lBB4w
HAYIKwYBBQUHAwIGCCsGAQUFBwMEBgYpAQEBAQIwCwYDVR0PBAQDAgKkMAwGA1Ud
EwEB/wQCMAAwCgYGKoUDAgIDBQADQQD5TY55KbwADGKJRK bwCGZw24sdIyayIX5
dn9hrKkNrZsWdetWY3KJFylSulykS/dfJ871IT 8dXPU5A7WqG4 MYG7MIG4AgEB
MFkwVDELMAkGA1UEBhMCUlUxDzANBgNVBAcTBk1vc2NvdzEiMCAGA1UEChQZT09P
ICJHYXJhbnQtUGFyay1UZWxlY29tIjEQMA4GA1UEAxMHVGVzdCBDQQIBATAKBgYq
hQMCAgkFADAKBgYqhQMCAhMFAARAco5PumEfUYVcLMb1cnzETNOuWC8Goda8pdUL
W5ASK tztCwM7wpXgAy Y6/sLtClO9sh8dKnAaEY2Yavg3altQ==
-----END CMS-----

Проверка подписи на сервере:

Смена pin-кода


Пример смены PIN-кода на устройстве:

var options = {};

try
{   
    plugin.changePin(deviceId, "12345678", "12345671", options);
}
catch (error) 
{
    console.log(error);
}

Здесь первым параметром выступает старый PIN-код, а вторым новый PIN-код.

Сравнение программ для создания электронной подписи

 

Плагины КриптоПро

Отдельная программа КриптоАРМ

Веб-сервис Контур.Крипто

Стоимость

Платные

Бесплатна только базовая версия Старт

Все функции доступны бесплатно

Форматы документов

Word и Excel, PDF

Все

Все

Соподпись/ пакетная подпись

Есть

Есть

Есть

Максимальный вес файла

Без ограничений

Без ограничений

до 100 Мб

Создание усовершенство

ванной подпись

Есть

Только в платных версиях

Есть

Присоединенная/ отсоединенная

Есть

Присоединенная/ отсоединенная

Только отсоединенная

Функции проверки, шифрования и расшифрования

Есть

Только в платных версиях

Есть

Получить электронную подпись

Строгая аутентификация на портале

Общая схема аутентификации, используемая в Рутокен Плагин, выглядит следующим образом:


Реализация данной схемы ничем принципиально не отличается от «Регистрация, сертификат уже имеется, выдан внешним УЦ».

Шифрование данных на клиенте для сервера

Для того, чтобы обеспечить конфиденциальность обмена данными между клиентом и сервером в плагине предусмотрено шифрование/расшифрование данных. Данные шифруются в формате CMS. Для того, чтобы зашифровать данные в формате CMS, требуется сертификат открытого ключа «адресата».

При этом расшифровать такое сообщение сможет только владелец закрытого ключа. При шифровании данных для сервера рекомендуется хранить сертификат сервера на Рутокен ЭЦП. Этот сертификат может быть записан на устройство при регистрации пользователя на портале.

Для этого следует использовать функцию importCertificate, при этом в качестве параметра category следует передать CERT_CATEGORY_OTHER. Для использования в функции cmsEncrypt нужно получить тело сертификата по его дескриптору с помощью функции getCertificate.

При этом дескриптор является уникальным и неизменным и может быть сохранен в учетной записи пользователя на сервере при импорте сертификата сервера. Для того, чтобы использовалось аппаратное шифрование по ГОСТ 28147-89, требуется установить опцию useHardwareEncryption в true. В противном случае будет использована быстрая программная реализация ГОСТ 28147-89.

Последовательность вызовов приведена на картинке:

Шифрование данных на клиенте:

try
{
    var recipientCert = plugin.getCertificate(deviceId, certRecId);        
}
catch (error) 
{
    console.log(error);
}

var options = {};
options.useHardwareEncryption = true;
var cms;

try
{
    cms = plugin.cmsEncrypt(deviceId, certSenderId, recipientCert, data, options);
}
catch (error) 
{
    console.log(error);
}

Расшифрование данных на сервере, перед расшифрованием сообщение нужно обрамить PEM-заголовками «——BEGIN PKCS7——» и «——END PKCS7——«:

openssl smime -engine gost -decrypt -in message.cms -inform PEM -recip recipient.crt -inkey recipient.key

recipient.crt — сертификат того, для кого зашифровано сообщение, recipient.key — ключ того, для кого зашифровано сообщение.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector