comaliesfy Оставлено | |
Пытаюсь задеплоить систему, использующую сертификат КриптоПро. Возникает ошибка ASN1 Certificate encode/decode error code base. [ErrorCode: 0x80093100] Как расшифровать ошибку, в какую сторону копать хотя бы? | |
two_oceans Оставлено | |
Добрый день. | |
comaliesfy Оставлено | |
Спасибо за наводку на мысль, приложение Инструменты КриптоПро почему-то экспортировало неверно сертификат в Base64( | |
Речь пойдет о файлах primary.key, masks.key и header.key, которые лежат в директории ххххх.000 на флешке. Данные файлы входят в состав криптоконтейнера закрытого ключа электронной подписи криптопровайдера КриптоПро, формат которого нигде не опубликован. Целью данной статьи является чтение контейнера и преобразование закрытого ключа в формат, который может быть прочитан в библиотеке OpenSSL. Долгое время было распространено ошибочное суждение, что достаточно сделать нечто вида (primary_key XOR masks_key) и мы получим закрытый ключ в чистом (raw) виде, однако забегая вперед, можно утверждать, что в КриптоПро было применено более сложное преобразование, в худшем случае состоящее из более чем 2000 (двух тысяч) операций хеширования.
Стоит упомянуть о существовании утилиты P12FromGostCSP которая позволяет конвертировать ключ в формат P12, доступный для работы с OpenSSL, но утилита имеет следующие существенные недостатки:
- Читает контейнер не напрямую, а через криптопровайдер, поэтому там, где кроме OpenSSL ничего нет, не работает.
- Если в свойствах ключа не отмечено, что ключ «экспортируемый», то конвертировать его невозможно.
- В демо версии не формирует файл с ключом, эта возможность присутствует только в платной версии.
Участники алкогольного рынка, осуществляющие деятельность в области производства и оборота этилового спирта, алкогольной и спиртосодержащей продукции, обязаны ежеквартально отчитываться в ФСРАР. В противном случае им будет назначен штраф за нарушение сроков предоставления необходимой информации. Для того чтобы избежать штрафа, важно соблюдать требования к срокам сдачи документов и к файлам электронной декларации.
- Сроки сдачи отчётности
- Требования к электронной декларации
- Как подписать документ в КриптоАРМ — понятная инструкция
- Способы копирования ЭЦП
- Как выполнить копирование ЭЦП средствами Windows
- Как экспортировать ЭЦП с помощью КриптоПро CSP
- Массовое копирование ключей
- Где оформить ЭЦП и получить помощь
- Что такое открытый ключ ЭЦП
- Инструкция как экспортировать открытый ключ
- Экспорт открытого ключа из КриптоПро CSP
- Что такое закрытый ключ ЭЦП
- Инструкция как экспортировать закрытый ключ
- Где на жестком диске находится сертификат
- Как посмотреть сертификат
- Где оформить сертификат и ЭЦП
- Глава первая
- Файл header. key
- КриптоПро CSP
- Читаем закрытый ключ и конвертируем
- Создание подписанного документа
- Установка сертификатов
- Глава вторая
- Файл masks. key
- Сборка утилиты конвертирования ключа
- Компиляция OpenSSL библиотеки
- Компиляция privkey
- Формирование файла закрытого ключа private. key
- Пользуемся закрытым ключом private. key для подписывания файла file. txt
- Проверяем подпись
- Немного про корневые и промежуточные сертификаты
- Как подписать документ в КриптоАРМ — видеоинструкция
- Интересные статьи
- Инструкция по созданию файла, подписанного ЭЦП, с использованием ПО КриптоПро
- Инструменты КриптоПро
Сроки сдачи отчётности
Отчётный период | Срок сдачи декларации | Срок сдачи корректировки |
I квартал 2022 года | до 20 апреля 2022 года | до 20 июля 2022 года |
II квартал 2022 года | до 20 июля 2022 года | до 20 октября 2022 года |
III квартал 2022 года | до 20 октября 2022 года | до 20 января 2023 года |
IV квартал 2022 года | до 20 января 2023 года | до 20 апреля 2023 года |
Требования к электронной декларации
Сформированный xml-файл необходимо:
- подписать;
- заархивировать;
- зашифровать сертификатом ФСРАР;
- отправить через личный кабинет.
Для этого необходимо приобрести сертификат квалифицированной электронной подписи и скачать сертификат электронной подписи ФСРАР с официального сайта контрольного органа. Для корректной работы понадобится криптопровайдер СКЗИ КриптоПро CSP версии 5.0 (годовая и бессрочная лицензии) и программа для подписи и шифрования файлов КриптоАРМ ГОСТ (годовая и бессрочная лицензии).
Бесплатный период использования КриптоПро CSP — 90 дней, КриптоАРМ ГОСТ — 14 дней.
Для подписания и шифрования файлов в настройках КриптоАРМ ГОСТ в правом меню выбрать Подпись, Архивирование и Шифрование; в “Настройки подписи” выбрать Стандарт — CMS, Вид — Присоединенная, Кодировка — DER.
В разделе “Сертификат подписи” выбрать сертификат организации или индивидуального предпринимателя. В разделе “Сертификаты шифрования” выбрать сертификат ФСРАР.
Итоговый файл должен иметь расширение «.xml.sig.zip.enc».
Таким образом, с помощью КриптоАРМ ГОСТ можно подписать файл электронной декларации и соблюсти требования ФСРАР.
1) устанавливаем cryptopro_install для установки зависимостей криптопро
2) устанавливаем whiptail (gui для интерактивного установщика криптопро)
3) запускаем gui-установщик и отмечаем все кроме КС2 из папки с разархивированным пакетом
4) стартуем и включаем службу pcscd
systemctl start pcscd systemctl enable pcscd
Проверяем статус
systemctl status pcscd
5) добавляем хранилище
sudo /opt/cprocsp/sbin/amd64/cpconfig -hardware reader -add HDIMAGE store
6) убеждаемся что создалось
/opt/cprocsp/bin/amd64/csptest -keyset -enum_cont -verifycontext -fqcn
7) копируем контейнер с ключами в каталог /var/opt/cprocsp/keys/DOMAIN/user_name/ (контейнер с ключами – это каталог например xwsdfjgs.000 )
chmod 777 -r /var/opt/cprocsp/keys/DOMAIN/user_name/
8) копируем как обычный каталог с файлами, при помощи, например, mc
9) убеждаемся что создалось
/opt/cprocsp/bin/amd64/csptest -keyset -enum_cont -verifycontext -fqcn | iconv -f cp1251 systemctl restart pcscd
Если имя сертификата указано кириллицей и с пробелами, а так же в некоторых других случаях, можно попробовать изменить файл /var/opt/cprocsp/keys/DOMAIN/user_name/name.key удалив в нем кириллицу и оставить только цифры и символы ( пробелы так же удалить)
Затем посмотреть
/opt/cprocsp/bin/amd64/csptest -keyset -enum_cont -verifycontext -fqcn
какой путь будет у контейнера, вероятно \\.\HDIMAGE\HDIMAGE\\xwsdfjgs.000
(обратить внимание, если HDIMAGE будет указано 2 раза)
10) устанавливаем сертификат прямо из контейнера
/opt/cprocsp/bin/amd64/certmgr -inst -cont '\\.\HDIMAGE\HDIMAGE\\xwsdfjgs.000'
если это не приносит результат, то 10а (привязка сертификата вручную)
10a)
/opt/cprocsp/bin/amd64/certmgr -inst -store uMy -file /home/DOMAIN/user/cert/64936161.cer -cont '\\.\HDIMAGE\HDIMAGE\\xwsdfjgs.000'
10б)
/opt/cprocsp/bin/amd64/certmgr -list -store uMy убеждаемся, что поле PrivateKey Link : Yes
11) устанавливаем корневые сертификаты
установка сертификатов минкомсвязи и казначейства /opt/cprocsp/bin/amd64/certmgr -inst -file /home/user/cert/guts_2012.cer -store uroot /opt/cprocsp/bin/amd64/certmgr -inst -file /home/user/cert/UTS-FK_2021.cer -store uroot
12) устанавливаем плагин для браузера ROOT
# rpm -ivh /home/user/cades_linux_amd64/Plugin/cprocsp-pki-*
Цифровой документооборот входит в нашу жизнь уверенными шагами и если для юридических лиц это уже суровые будни, то многие физические лица могли с этим еще не столкнуться. Но со временем оставаться в стороне становится всё сложнее и нужно приспосабливаться к меняющимся условиям, иначе можно получить не совсем приятные последствия.
Заключение договоров — дело привычное. Их заключают в банках, в больницах, при покупке мебели, оплате обучения. Прочитать договор, проверить реквизиты юридического лица, с которым заключается договор, убедиться в наличии печати и подписи — стандартная процедура, которая уменьшает риск обмана. Однако приобретённые навыки работы с бумажными договорами не могут просто так перейти в цифровой мир в силу специфики электронных документов.
В этой статье хочется рассказать о своем опыте знакомства с российскими электронными подписями (ЭП), которые используются для подписания договоров с физическими лицами в том числе и страховыми компаниями, а также подводных камнях, на которые наткнулся при этом.
Для меня эта история началась при заключении договора со страховой компанией ООО СК “Сбербанк страхование”. После оформления мне показались подозрительными некоторые факты (небольшой спойлер: всё оказалось хорошо) и я стал разбираться, как же мне проверить, что полученный документ действительно выдан страховой компанией, а не некими третьими лицами.
Что же меня насторожило?
После расчёта суммы в калькуляторе на сайте и заполнения формы с паспортными и контактными данными мне на электронную почту пришло письмо, в котором кроме общей информации, полезных ссылок и контактов было 3 вложения: памятка, правила страхования и сам полис. Я ознакомился с документами, оплатил страховку и стал ждать подписанную версию полиса.
Через полчаса ожидания я стал волноваться, быстрый поиск показал, что у страховой компании есть аж 3 разных активных домена: www.sberbank-insurance.ru, www.sberins.ru и sberbankins.ru, что не добавляло мне уверенности в компании.
Звонок в контакт центр принёс информацию о том, что присланный полис и является финальным документом с ЭП страховой компании. Мне показалось странным, что компания отдаёт уже подписанный документ еще до факта оплаты клиентом и я стал проверять полученный pdf файл.
Как подписать документ в КриптоАРМ — понятная инструкция
Подписать документы электронной подписью можно в программе КриптоАРМ. Еще в ней можно проверить подпись и зашифровать документ. О том, как подписать документ ЭЦП, смотрите пошаговую инструкцию в скриншотах или обучающий ролик.
Шаг 1. Выберите файл, который нужно подписать. Щелкните на него правой кнопкой мыши. В выпадающем списке выберите «КриптоАРМ» → «Подписать».
Шаг 2. Откроется «Мастер создания электронной подписи». Нажмите кнопку «Далее».
Шаг 3.В разделе «Выбор файлов» уже загружен документ, который мы выбрали на первом шаге. Можно добавить еще несколько документов или папку с файлами, которые нужно подписать.
Если нужно проверить документ перед подписанием, кликните на «Просмотр». Файл откроется в новом окне.
Чтобы перейти к следующему шагу, нажмите «Далее».
Шаг 4. В разделе «Выходной формат» выберите тип кодировки: DER или BASE64. Зачастую можно выбрать любую — файл будет подписан корректно. Но есть несколько исключений. Например, для ФСРАР подойдет только кодировка DER.
Шаг 5. В разделе «Параметры подписи» в графе «Использование подписи» можете оставить значение «Не задано» или выберите вариант, подходящий по смыслу документа, например, «Подписано».
Также в этом разделе можно выбрать вид подписи.
Присоединенная подпись | Отсоединенная подпись |
Прикрепляется к исходному документу. После подписания вес файла увеличивается. | Хранится в отдельном документе, вес и содержимое исходного файла не меняется. |
Чтобы проверить подпись, нужен только подписанный файл. | Чтобы проверить подпись, нужен исходный документ и файл с подписью. |
Для чтения подписанного документа нужна специальная программа, чтобы извлечь файл. | Можно прочитать документ без специальных программ. |
Чтобы создать отсоединенную подпись, поставьте галочку напротив пункта «Сохранить подпись в отдельном файле». Если галочка не стоит, по умолчанию будет создана присоединенная подпись.
Когда выберете нужные параметры, кликните «Далее».
Шаг 6. На этапе «Выбор сертификата подписи» нажмите кнопку «Выбрать». В новом окне выберите свой сертификат подписи. Если в окне нет ни одного сертификата, его нужно установить
Электронная подпись для любых задач
В комплекте сертификат, сертифицированный токен и лицензия «КриптоПро» — все, что нужно для работы
Заказать подпись
Шаг 7. Проверьте, все ли данные для подписания документа выбраны верно. Нажмите кнопку «Готово».
Если вы часто выбираете одни и те же параметры, на этом этапе можно создать шаблон для подписи. Для этого поставьте галочку напротив пункта «Сохранить данные в профиль для дальнейшего использования». Теперь на втором шаге вы можете выбрать нужный профиль и не устанавливать большую часть настроек вручную.
Шаг 8. Создавая подпись, программа может запросить пароль.
Шаг 9. Документ подписан. Он сохранится в папку, которую вы указали на четвертом шаге.
Значок подписанного документа отличается от исходного файла, поэтому его легко найти.
Из нашей статьи вы узнаете:
Электронную цифровую подпись традиционно записывают на токен в виде USB-карты, что позволяет использовать ее на разных компьютерах и не зависеть от одного рабочего места. Однако необходимость скопировать ключи и сертификаты может появиться в следующих случаях:
- желание скопировать информацию для защиты данных и предотвращения потери сведений по причине выхода из строя токена;
- необходимость работы одновременно на нескольких компьютерах;
- использование облачного сервера, где доступ к ЭЦП получит несколько пользователей;
- необходимость переустановки операционной системы, где на жестком диске есть цифровая подпись.
Способы копирования ЭЦП
Сегодня доступно копирование цифровой электронной подписи следующими способами:
- с помощью стандартных инструментов OS Windows (здесь экспорт идет из реестра операционной системы);
- с использованием возможностей КриптоПро CSP;
- с помощью массового копирования.
Как выполнить копирование ЭЦП средствами Windows
Это самый оперативный и простой вариант переноса данных, который сработает только в отношении ключей, находящихся в реестре операционной системы. Также понадобится установленная программа КриптоПро в версии не ниже 3.0. Для выполнения операции выполните следующие действия:
- Перейдите в раздел «Сертификаты» вашего браузера, находящийся в его свойствах
- Найдите во вкладе «Личные» копируемый контейнер с находящимися там сертификатами и нажмите кнопку «Экспорт»
- Нажмите «Нет» на предложение мастера выполнить экспорт вместе с сертификатом и закрытый ключ
- В появившейся форме выберите нужный формат файла сертификата (по умолчанию необходима DER-кодировка)
- Укажите директорию для сохранения ключей
- Скопируйте, нажав последовательно «Далее» и «Готово»
Теперь можно использовать электронную подпись без носителя ключа.
Как экспортировать ЭЦП с помощью КриптоПро CSP
Утилита позволяет записать контейнер на другой ПК или флешку. Сделать это можно следующим образом:
- Откройте раздел «Сервис» в программе и выберите пункт «Скопировать контейнер».
- Введите соответствующее имя контейнера (его можно найти в реестре операционной системы) и криптопровайдер для его поиска.
- Введите пароль вашего ключа и перейдите в блок непосредственного копирования.
- Укажите имя обновлённого контейнера и выберите расположение его хранилища.
- Выберите нужный носитель и укажите новый PIN для доступа к контейнеру с последующим подтверждением.
Возможность копирования контейнера доступна только при наличии активного параметра «Экспортируемый», который должен быть выбран ещё на стадии генерации ЭЦП. В противном случае система выдаст только ошибку.
Массовое копирование ключей
Способ позволяет за один раз перенести на другой компьютер несколько цифровых подписей одновременно. Для этого на компьютере создайте новую ветку и скопируйте путь с основного рабочего ПК. Сам процесс копирования идёт следующим образом:
- Определите SID-идентификатор ПК с помощью команды wmic useraccount where name=’name user; get sid (полученный код надо запомнить).
- Копируйте ветку из реестра, которая расположена по адресу \HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Crypto Pro\Settings\Users\S-1…ХХХ\Keys, где ХХХ — полученный выше код.
- Экспортируйте папку Keys, где находятся ключи.
- Перенесите сертификаты, скопировав директорию, расположенную по адресу C:\Users\ polzovatel\AppData\Roaming\Microsoft\SystemCertificates\My.
- Скопируйте ветку и директорию с находящимися там сертификатами на новый ПК (для этого первоначальную строку важно подкорректировав, указав там нужный SID).
- Откройте файл с именем fileName.reg, откуда загрузите данные в реестровую запись.
Если не получилось скопировать
Процесс переноса электронной подписи с компьютера на флешку любым из предложенных способов обычно проходит без ошибок. Однако в некоторых случаях сохранить ЭЦП не удаётся — возникает «Ошибка копирования контейнера».
Если появилась ошибка, то владельцу подписи нужно обратиться в удостоверяющий центр, который выдал данную электронную подпись. Невозможность копирования контейнера свидетельствует о том, что ключ защищён и нужно получить его копию.
Где оформить ЭЦП и получить помощь
Если для работы вам необходима цифровая электронная подпись, то обращайтесь в УЦ «Астрал-М». Мы специализируемся на оформлении ЭЦП любого типа, предлагая следующие преимущества:
- оперативное выполнение заказа;
- широкий выбор тарифных планов с возможностью подключения дополнительных опций;
- помощь в подборе оптимального плана с учетом специфики работы заказчика;
- консультации по вопросам подготовки документов.
Для оформления ЭЦП оставьте заявку на сайте, заполнив форму обратной связи, или свяжитесь с нами по телефону. При необходимости возможно открытие подписи в офисе клиента и в ускоренном формате.
Квалифицированная электронная подпись состоит из открытого и закрытого ключа. Обе составляющие создаются с помощью криптографических алгоритмов. Для работы с КЭП нужно использовать оба ключа — каждый из них выполняет свою функцию.
Что такое открытый ключ ЭЦП
Открытый ключ электронной подписи представляется в виде электронного сертификата или бумажного документа. Сертификат выдаётся только удостоверяющим центром и содержит информацию, которая используется для проверки подписи владельца и шифрования данных.
Открытый ключ можно использовать для работы с партнёрами, в отличие от закрытого, который хранится в защищённом месте. Контрагенты могут использовать открытый ключ владельца для шифрования данных, которые ему посылают. Это означает, что после отправки этих данных, получить доступ к ним сможет только владелец закрытой части ключа.
Сертификат содержит в себе следующие данные:
срок действия сертификата;
реквизиты удостоверяющего центра;
ФИО владельца сертификата;
название криптографического алгоритма;
Электронный сертификат виден на обычных носителях в виде файла с расширением .cer, а на защищённых картах Рутокен, eToken и JaCarta он скрыт. Чтобы увидеть скрытый сертификат, его необходимо экспортировать.
Инструкция как экспортировать открытый ключ
Экспортировать открытый ключ электронной подписи можно через свойства обозревателя либо из криптопровайдера КриптоПро CSP. При этом носитель с ключом должен быть подключён к компьютеру.
Экспорт открытого ключа через свойства обозревателя
1. В системе Windows перейдите в «Пуск» → «Панель управления» → «Свойства обозревателя (Свойства браузера)».
2. Перейдите на вкладку «Содержание» и нажмите на кнопку «Сертификаты».
3. В списке выберите нужный сертификат, щёлкнув по его названию, и нажмите кнопку «Экспорт».
4.В окне «Мастер экспорта сертификатов» нажмите кнопку «Далее», затем «Нет, не экспортировать закрытый ключ» и снова «Далее».
5. В окне «Формат экспортируемого файла» выберите «Файлы в DER-кодировке X.509 (.CER)» и нажмите кнопку «Далее».
6. Выберите место сохранения сертификата, нажав кнопку «Обзор», затем нажмите на кнопку «Сохранить» → «Далее» → «Готово».
Экспорт открытого ключа из КриптоПро CSP
1. В системе Windows перейдите в «Пуск» → «Панель управления» → «КриптоПро CSP».
2. Перейдите на вкладку «Сервис» и нажмите кнопку «Просмотреть сертификаты в контейнере».
3. Нажмите кнопку «Обзор», выберите нужный контейнер и нажмите «Ок» → «Далее».
4. В окне «Сертификат для просмотра» нажмите кнопку «Свойства».
5. Перейдите на вкладку «Состав» и нажмите кнопку «Копировать в файл».
6. В окне «Мастер экспорта сертификатов» нажмите кнопку «Далее», затем «Нет, не экспортировать закрытый ключ» и снова «Далее».
7. В окне «Формат экспортируемого файла» выберите «Файлы в DER-кодировке X.509 (.CER)» и нажмите кнопку «Далее».
8. Выберите место сохранения сертификата, нажав кнопку «Обзор», затем нажмите на кнопку «Сохранить» → «Далее» → «Готово».
Что такое закрытый ключ ЭЦП
Закрытый ключ представлен в виде уникального набора символов, которые используются криптографическим алгоритмом для создания защищённой части электронной подписи.
Владелец электронной подписи использует именно закрытую часть для подписания электронных документов. Любой, кто получает доступ к закрытому ключу электронной подписи, может им воспользоваться. Поэтому его хранят на защищённых носителях: смарт-карте, токене, USB-носителе или дискете.
Хранить закрытый ключ можно на компьютере, однако это небезопасно — воспользоваться им сможет любой, кто имеет доступ к компьютеру. Самым защищённым носителем считается смарт-карта, так как на ней используется двухфакторная аутентификация.
Как и в случае с сертификатом, закрытый ключ может быть как скрыт так и виден, в зависимости от носителя. Он представлен в виде папки, которая содержит несколько файлов с расширением .key, поэтому закрытый ключ также называют контейнером. Скрытый контейнер с закрытым ключом нужно экспортировать, чтобы получить к нему прямой доступ.
Инструкция как экспортировать закрытый ключ
Выполнять экспорт закрытого ключа электронной подписи можно из криптопровайдера КриптоПро CSP.
Перейдите на вкладку «Сервис» и нажмите на кнопку «Скопировать контейнер».
Если вы копируете закрытый ключ с защищённого носителя, введите pin-код.
Введите название копии закрытого ключа и нажмите «Готово».
В окне «Выбор ключевого носителя» выберите носитель, на который будет произведено копирование контейнера с закрытым ключом.
Установите пароль на контейнер. Несмотря на то что этот шаг необязательный, установка пароля обеспечит дополнительную защиту.
Открытый и закрытый ключи квалифицированной электронной подписи выполняют разные функции, но для работы нужны обе части. В некоторых случаях владельцу ЭЦП нужно сделать экспорт на другой носитель, воспользоваться он может как средствами Windows, так и криптопровайдером КриптоПро CSP.
Из нашей статьи вы узнаете:
Электронную цифровую подпись владелец может использовать на различных компьютерах одновременно, но для начала её необходимо предварительно перенести (скопировать).
Для этого важно сначала найти сертификат как самой ЭЦП, так и аккредитованного УЦ, который ее сгенерировал и выдал. В нем сохранены:
- данные о владельце и УЦ, который оформил сертификат;
- срок действия;
- наименование ЭЦП;
- ключ для проверки;
- сведения об ограничениях в использовании.
Где на жестком диске находится сертификат
Необходимые для копирования файлы могут находиться в следующих местах:
- На персональном компьютере либо ноутбуке (для его обнаружения при установке по умолчанию на OS Windows версии Vista и старше перейдите по адресу: C:/Users/Пользователь/AppData/Roaming/Microsoft/System/Certificates. Обратим внимание, что доступ к этим папкам есть только при наличии прав администратора.
- В реестре OS Windows (для версии 32 бита это папка HKEY_LOCАL_MАCHINE\SOFTWARE\ CryptoPrо\Setting\Users\(имя пользователя ПК)\Keys\, а для версии 64 бита это директория HKEY_LOCAL_MАCHINE\SOFTWARE\Wow6432Node\CryptoPrо\Setting\Users\(имя пользователя ПК)\Keys.
- В реестре OS Linux (для вывода списка открытых ключей необходимо задать команду csptest -keyset -enum_cont -verifycоntext -fqcn -machinekeys, а для пользовательских сертификатов команда будет csptest -keyset -enum_cont -verifycоntext -fqcn.
Еще одна копия файлов сертификата находится непосредственно в папке Windows в зашифрованном виде, поэтому получить к ней доступ или скопировать невозможно из-за отсутствия прав.
Непосредственно файл сертификата имеет в зависимости от вида кодировки расширение .csr либо .cer, а по объему занимает всего несколько килобайт. На жестком диске вашего компьютера хранится только открытый сертификат. Закрытый же находится на защищенном токене, и доступ к нему возможен только после ввода пользовательского пароля, выданного в удостоверяющем центре.
Как посмотреть сертификат
Просмотреть перечень сертификатов, скопировать их, удалить можно с использованием следующих инструментов;
- панель управления операционной системы;
- браузер Internet Explorer;
- специальные утилиты типа «КриптоПро»;
- менеджер Certmgr.
При использовании браузера Internet Explorer выполните следующие действия:
- запустите браузер;
- выберите в настройках пункт «Свойства браузера»;
- перейдите в раздел «Содержание» в открывшемся окне;
- кликните по графе «Сертификаты».
После этого появится окошко, где будет перечислен весь перечень установленных на компьютере открытых сертификатов. Дополнительно будет указан список сторонних поставщиков ПО.
Преимущество использования браузера Internet Explorer — в возможности просмотра списка ключей, даже если нет прав администратора. Недостатком же будет невозможность удаления устаревших или ненужных уже сертификатов с жесткого диска компьютера.
При использовании панели управления OS Windows для просмотра открытых сертификатов, установленных на компьютере, выполните следующие действия с правами администратора:
- открываем командную строку с помощью Win + R;
- введите команду cmd и нажмите «enter»;
- перейдите по команде mmc в терминал
- откройте в окне вкладку «Файл» и выберите пункт «Добавить изолированную оснастку»;
- кликните по разделу «Сертификат».
Для просмотра перечня установленных ранее сертификатов на ПК с помощью приложения «КриптоПРО» достаточно выбрать раздел «Сертификаты». Использование данного ПО позволит при наличии прав администратора не только просматривать, но и копировать открытые сертификаты, удалять их.
В OS Windows есть стандартный менеджер Certmgr для работы с установленными ранее сертификатами. С его помощью можно увидеть информацию об открытых ключах, данные об УЦ. Для использования менеджера выполните следующие действия:
- откройте меню «Пуск»;
- введите в командной строке certmgr.msc;
- выберите в меню вкладки «Личное», «Корневые сертификаты УЦ».
В итоге откроется окно со списком проверочных ключей. Специфика менеджера — в необходимости запуска с правами администратора. Важный минус сервиса — в некорректности отображения ЭЦП, что важно учитывать при просмотре.
В интернете можно скачать и другие программы для просмотра и работы с открытыми сертификатами операционной системы. Использовать их не рекомендовано из-за отсутствия гарантии безопасности и защиты от утечки данных на сторонние серверы. Сегодня Минкомсвязи РФ сертифицировано только приложение «КриптоПРО», и возможно использование встроенных инструментов операционной системы.
Где оформить сертификат и ЭЦП
Если для ведения электронного документооборота, работы на государственных порталах, сдачи отчетности или раскрытия информации вам необходима электронная цифровая подпись, то оформите ее в УЦ «Астрал-М». Наш удостоверяющий центр имеет аккредитацию Минкомсвязи на оформление ЭЦП и предлагает каждому клиенту:
- возможность оформления цифровых подписей любого типа;
- широкий выбор тарифных планов под конкретные задачи;
- расширение возможности ЭЦП с помощью дополнительных опций для учета специфики работы компании;
- доступную цену на оформление цифровых подписей;
- любую форму оплаты.
Для приобретения электронной цифровой подписи оставьте заявку на сайте или свяжитесь с сотрудниками по телефону. После согласования тарифного плана вам будет направлен перечень необходимых документов и счет на оплату оформления ЭЦП. На выполнение всех действий уйдет 1—2 рабочих дня, но при желании возможно открытие подписи в ускоренном формате.
Глава первая
Все манипуляции с PDF документом приведены в чистой версии ОС Windows 10, русская домашняя редакция, как наиболее вероятной среде работы простого пользователя. Набор софта, используемый в статье, также является непрофессиональным и доступным для всех.
Для начала я открыл документ в просмотрщике Foxit Reader, который использую как основной:
Это выглядит очень и очень подозрительно — документ модифицирован непонятно кем, сертификат также не является доверенным. Система не может проверить цепочку доверия для данного сертификата и помечает его недействительным.
Кроме имени организации, которой выдан сертификат, видно наименование выдавшей его организации, ООО “ИТК”. Поиск по запросу “ООО ИТК сертификат” вывел меня на страницу Установка корневого сертификата Удостоверяющего центра ООО «ИТК». Это официальный сайт ООО «Интернет Технологии и Коммуникации», который является одним из удостоверяющих центров, выдающих сертификаты ЭП.
Следуем инструкции: нам нужно пройти по ссылке и скачать с Google Drive (!) RAR архив (!!) «Корневой квалифицированный.rar» (который ещё надо найти чем открыть, пришлось ставить 7-zip) и видим там 2 сертификата: корневой и промежуточный. Корневой выдан Минкомсвязи самим себе, а промежуточный — министерством для ООО “ИТК”. Устанавливаем их, соглашаемся с добавлением корневого сертификата (краем глаза замечая, что sha1 отпечаток устанавливаемого ключа и картинки в инструкции совпадает, но про такое сравнение в пунктах установки ничего нет).
Снова открываем сертификат из документа. И чуда не произошло, цепочка доверия от корневого до конечного не строится!
Изучаем ЭП подробнее: в Foxit Reader есть дополнительная информация о свойствах подписи:
Ага, алгоритм хеширования ГОСТовский, ЭП создана в КриптоПро PDF. Возможно, Windows не знает про ГОСТ шифрование и поэтому ему нужен дополнительный криптопровайдер.
Идём на сайт КриптоПро, регистрируемся, скачиваем пробную версию КриптоПро CSP 5.0 на 3 месяца. Что будет дальше — не совсем понятно, возможно всё превратится в тыкву, посмотрим.
Снова открываем просмотр сертификата ЭП:
Выглядит уже лучше. Видно, что система считает сертификат действительным, построена цепочка от корневого сертификата через промежуточный.
Сообщение о проверке немного улучшилось, но всё равно Foxit Reader не может проверить сертификат (вероятно дело в ГОСТовском алгоритме):
В Adobe Acrobat Reader DC проверка тоже не успешна:
И на этом вроде бы можно остановиться: Foxit Reader подтверждает, что документ не был изменен после подписания, руками можно проверить, что сертификат подтверждается системой и действителен. Но всё же хочется довести дело до конца, чтобы хотя бы одна программа сказала: да, документ действителен, всё хорошо.
Вспоминаем, что полис подписан в программе КриптоПро PDF. Вероятно, что раз она может создавать такие подписи, то уж наверняка должна их и проверять. Ставим.
+1 триал версия на 90 дней, хотя вроде бы надпись при установке успокаивает, что при использовании продукта в Adobe Acrobat Reader DC лицензия не нужна.
Ура, долгожданное сообщение о том, что всё хорошо.
Подведем промежуточный итог. Для проверки действительности ЭП на документе нужно:
- Узнать, какой удостоверяющий центр выдал сертификат, которым подписан документ, установить его промежуточный и, если такого еще нет, корневой сертификат (в нашем случае из rar архива с Google Drive);
- Установить в систему криптопровайдер (вероятно, существуют другие криптопровайдеры, которые обучат Windows ГОСТовским криптоалгоритмам) КриптоПро CSP с триалом на 3 месяца и неизвестностью после;
- Для проверки подписи из Adobe Acrobat Reader DC установить КриптоПро PDF (без CSP он не ставится).
Вот такой алгоритм вырисовывается из поверхностного анализа темы за вечер. Проблема проверки цифровой подписи была решена, но видно трудности, которые могут возникнуть у рядового пользователя:
- Нужно как-то найти и скачать корневой и промежуточный сертификаты. Непонятно, откуда его можно скачать официально, а поиск в сети может привести к установке левых сертификатов, через которые мошенники могут атаковать незадачливого пользователя;
- Нужно понять, какого софта не хватает в системе и где его взять, из коробки ничего не работает. В данной статье приведены примеры на основе продуктов КриптоПро только потому, что это название встретилось в информации о создании ЭП. Нужно изучать тему в поиске аналогов;
- Проверка полноценно заработала только в Adobe Acrobat Reader DC, в Foxit Reader проверка ЭП неполная, нет долгожданной зелёной галочки. Нужно копать дальше, вероятно есть решения.
Файл header. key
Из этого файла нам потребуется параметры электронной подписи CryptoProParamSet (подчеркнуто красным).
- GostR3410_2001_CryptoPro_A_ParamSet — 1.2.643.2.2.35.1
- GostR3410_2001_CryptoPro_B_ParamSet — 1.2.643.2.2.35.2
- GostR3410_2001_CryptoPro_C_ParamSet — 1.2.643.2.2.35.3
- GostR3410_2001_CryptoPro_XchA_ParamSet — 1.2.643.2.2.36.0
- GostR3410_2001_CryptoPro_XchB_ParamSet — 1.2.643.2.2.36.1
А также первые 8 байт открытого ключа (подчеркнуто) для контроля правильности чтения закрытого.
КриптоПро CSP
Для подписи электронных документов, будем использовать программное обеспечение КриптоПро CSP.
Использование иных криптографических программ под административную ответственность руководителей и лиц, использующих ПО СКЗИ, не имеющих действующего сертификата соответствия ФСБ РФ.
Читаем закрытый ключ и конвертируем
Файл privkey.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/pem.h>
#include <openssl/cms.h>
#include <openssl/err.h>
#include "gost_lcl.h"
/* Convert little-endian byte array into bignum */
BIGNUM *reverse32bn(char *b, BN_CTX *ctx)
{
BIGNUM *res;
char buf[32];
BUF_reverse(buf, b, 32);
res = BN_bin2bn(buf, 32, BN_CTX_get(ctx));
OPENSSL_cleanse(buf, sizeof(buf));
return res;
}
void xor_material(char *buf36, char *buf5C, char *src)
{
int i;
for(i = 0; i < 32; i++)
{
buf36[i] = src[i] ^ 0x36;
buf5C[i] = src[i] ^ 0x5C;
}
}
int make_pwd_key(char *result_key, char *start12, int start12_len, char *passw)
{
int result;
int i;
char pincode4[1024];
int pin_len;
char current[32];
char material36[32];
char material5C[32];
char hash_result[32];
gost_hash_ctx ctx;
init_gost_hash_ctx(&ctx, &GostR3411_94_CryptoProParamSet);
memset(pincode4, 0, sizeof(pincode4));
pin_len = strlen(passw);
if (pin_len*4 > sizeof(pincode4)) { result = 1; goto err; }
for(i = 0; i < pin_len; i++)
pincode4[i*4] = passw[i];
start_hash(&ctx);
hash_block(&ctx, start12, start12_len);
if (pin_len)
hash_block(&ctx, pincode4, pin_len * 4);
finish_hash(&ctx, hash_result);
memcpy(current, (char*)"DENEFH028.760246785.IUEFHWUIO.EF", 32);
for(i = 0; i < (pin_len?2000:2); i++)
{
xor_material(material36, material5C, current);
start_hash(&ctx);
hash_block(&ctx, material36, 32);
hash_block(&ctx, hash_result, 32);
hash_block(&ctx, material5C, 32);
hash_block(&ctx, hash_result, 32);
finish_hash(&ctx, current);
}
xor_material(material36, material5C, current);
start_hash(&ctx);
hash_block(&ctx, material36, 32);
hash_block(&ctx, start12, start12_len);
hash_block(&ctx, material5C, 32);
if (pin_len)
hash_block(&ctx, pincode4, pin_len * 4);
finish_hash(&ctx, current);
start_hash(&ctx);
hash_block(&ctx, current, 32);
finish_hash(&ctx, result_key);
result = 0; //ok
err:
return result;
}
BIGNUM *decode_primary_key(char *pwd_key, char *primary_key, BN_CTX *bn_ctx)
{
BIGNUM *res;
char buf[32];
gost_ctx ctx;
gost_init(&ctx, gost_cipher_list->sblock);
gost_key(&ctx, pwd_key);
gost_dec(&ctx, primary_key, buf, 4);
res = reverse32bn(buf, bn_ctx);
OPENSSL_cleanse(buf, sizeof(buf));
return res;
}
BIGNUM *remove_mask_and_check_public(char *oid_param_set8, BIGNUM *key_with_mask, BIGNUM *mask, char *public8, BN_CTX *ctx)
{
int result;
EC_KEY *eckey = NULL;
const EC_POINT *pubkey;
const EC_GROUP *group;
BIGNUM *X, *Y, *order, *raw_secret, *mask_inv;
char outbuf[32], public_X[32];
ASN1_OBJECT *obj;
int nid;
order = BN_CTX_get(ctx);
mask_inv = BN_CTX_get(ctx);
raw_secret = BN_CTX_get(ctx);
X = BN_CTX_get(ctx);
Y = BN_CTX_get(ctx);
if (!order || !mask_inv || !raw_secret || !X || !Y) { result = 1; goto err; }
obj = ASN1_OBJECT_create(0, oid_param_set8+1, *oid_param_set8, NULL, NULL);
nid = OBJ_obj2nid(obj);
ASN1_OBJECT_free(obj);
if (!(eckey = EC_KEY_new())) { result = 1; goto err; }
if (!fill_GOST2001_params(eckey, nid)) { result = 1; goto err; }
if (!(group = EC_KEY_get0_group(eckey))) { result = 1; goto err; }
if (!EC_GROUP_get_order(group, order, ctx)) { result = 1; goto err; }
if (!BN_mod_inverse(mask_inv, mask, order, ctx)) { result = 1; goto err; }
if (!BN_mod_mul(raw_secret, key_with_mask, mask_inv, order, ctx)) { result = 1; goto err; }
if (!EC_KEY_set_private_key(eckey, raw_secret)) { result = 1; goto err; }
if (!gost2001_compute_public(eckey)) { result = 1; goto err; }
if (!(pubkey = EC_KEY_get0_public_key(eckey))) { result = 1; goto err; }
if (!EC_POINT_get_affine_coordinates_GFp(group, pubkey, X, Y, ctx)) { result = 1; goto err; }
store_bignum(X, outbuf, sizeof(outbuf));
BUF_reverse(public_X, outbuf, sizeof(outbuf));
if (memcmp(public_X, public8, 8) != 0) { result = 1; goto err; }
result = 0; //ok
err:
if (eckey) EC_KEY_free(eckey);
if (result == 0) return raw_secret;
return NULL;
}
int file_length(char *fname)
{
int len;
FILE *f = fopen(fname, "rb");
if (f == NULL) return -1;
fseek(f, 0, SEEK_END);
len = ftell(f);
fclose(f);
return len;
}
int read_file(char *fname, int start_pos, char *buf, int len)
{
int read_len;
FILE *f = fopen(fname, "rb");
if (f == NULL) return 1;
if (start_pos) fseek(f, start_pos, SEEK_SET);
read_len = fread(buf, 1, len, f);
fclose(f);
if (read_len != len) return 1;
return 0; //ok
}
int get_asn1_len(unsigned char *buf, int *size_hdr)
{
int n, i, res;
int pos = 0;
if ((buf[pos]&0x80) == 0) {
*size_hdr = 1;
return buf[pos];
}
n = buf[pos++]&0x7f;
res = 0;
for(i = 0; i < n; i++) {
res = res*256 + buf[pos++];
}
*size_hdr = n+1;
return res;
}
#define MAX_HEADER 20000
int read_container(char *fpath, int flag2, char *salt12, char *primary_key, char *masks_key, char *public8, char *oid_param_set8)
{
int result;
char primary_path[1024+30];
char masks_path[1024+30];
char header_path[1024+30];
char header_buf[MAX_HEADER];
int header_len;
int i, len, pos, size_hdr;
if (strlen(fpath)>1024) { result = 1; goto err; }
sprintf(header_path, "%s/header.key", fpath);
if (flag2 == 0)
{
sprintf(primary_path, "%s/primary.key", fpath);
sprintf(masks_path, "%s/masks.key", fpath);
}
else
{
sprintf(primary_path, "%s/primary2.key", fpath);
sprintf(masks_path, "%s/masks2.key", fpath);
}
if (read_file(primary_path, 4, primary_key, 32)) { result = 1; goto err; }
if (read_file(masks_path, 4, masks_key, 32)) { result = 1; goto err; }
if (read_file(masks_path, 0x26, salt12, 12)) { result = 1; goto err; }
header_len = file_length(header_path);
if (header_len < 0x42 || header_len > MAX_HEADER) { result = 1; goto err; }
if (read_file(header_path, 0, header_buf, header_len)) { result = 1; goto err; }
//------------- skip certificate ---------------------------
pos = 0;
for(i = 0; i < 2; i++)
{
get_asn1_len(header_buf+pos+1, &size_hdr);
pos += size_hdr+1;
if (pos > header_len-8) { result = 2; goto err; }
}
//------------------ get oid_param_set8 -----------------------
#define PARAM_SET_POS 34
if (memcmp(header_buf+pos+PARAM_SET_POS, "\x6\x7", 2) != 0) { result = 2; goto err; }
memcpy(oid_param_set8, header_buf+pos+PARAM_SET_POS+1, 8);
//------------------ get public8 -----------------------
result = 2; //not found
pos += 52;
for(i = 0; i < 3; i++)
{
len = get_asn1_len(header_buf+pos+1, &size_hdr);
if (len == 8 && memcmp(header_buf+pos, "\x8a\x8", 2) == 0)
{
memcpy(public8,header_buf+pos+2,8);
result = 0; //ok
break;
}
pos += len+size_hdr+1;
if (pos > header_len-8) { result = 2; goto err; }
}
err:
OPENSSL_cleanse(header_buf, sizeof(header_buf));
return result;
}
#define START_OID 0x12
#define START_KEY 0x28
unsigned char asn1_private_key[72] = {
0x30,0x46,2,1,0,0x30,0x1c,6,6,0x2a,0x85,3,2,2,0x13,0x30,0x12,6,7,0x11,
0x11,0x11,0x11,0x11,0x11,0x11,6,7,0x2a,0x85,3,2,2,0x1e,1,4,0x23,2,0x21,0
};
int main(int argc, char **argv)
{
int result;
char *container_path;
char *passw;
char salt12[12];
char primary_key[32];
char masks_key[32];
char public8[8];
char oid_param_set8[8];
BN_CTX *ctx;
BIGNUM *key_with_mask;
BIGNUM *mask;
BIGNUM *raw_key;
char pwd_key[32];
char outbuf[32];
ctx = BN_CTX_new();
if (argc == 2)
{
container_path = argv[1];
passw = "";
}
else
if (argc == 3)
{
container_path = argv[1];
passw = argv[2];
}
else
{
printf("get_private container_path [passw]\n");
result = 1;
goto err;
}
if (read_container(container_path, 0, salt12, primary_key, masks_key, public8, oid_param_set8) != 0 &&
read_container(container_path, 1, salt12, primary_key, masks_key, public8, oid_param_set8) != 0)
{
printf("can not read container from %s\n", container_path);
result = 2;
goto err;
}
make_pwd_key(pwd_key, salt12, 12, passw);
key_with_mask = decode_primary_key(pwd_key, primary_key, ctx);
OPENSSL_cleanse(pwd_key, sizeof(pwd_key));
mask = reverse32bn(masks_key, ctx);
raw_key = remove_mask_and_check_public(oid_param_set8, key_with_mask, mask, public8, ctx);
if (raw_key)
{
BIO *bio;
store_bignum(raw_key, outbuf, sizeof(outbuf));
memcpy(asn1_private_key+START_OID, oid_param_set8, 8);
memcpy(asn1_private_key+START_KEY, outbuf, 32);
//bio = BIO_new_file("private.key", "w");
bio = BIO_new_fp(stdout, BIO_NOCLOSE | BIO_FP_TEXT);
PEM_write_bio(bio, "PRIVATE KEY", "", asn1_private_key, sizeof(asn1_private_key));
BIO_free(bio);
OPENSSL_cleanse(outbuf, sizeof(outbuf));
OPENSSL_cleanse(asn1_private_key, sizeof(asn1_private_key));
result = 0; //ok
}
else
{
printf("Error check public key\n");
result = 3;
}
err:
BN_CTX_free(ctx);
OPENSSL_cleanse(salt12, sizeof(salt12));
OPENSSL_cleanse(primary_key, sizeof(primary_key));
OPENSSL_cleanse(masks_key, sizeof(masks_key));
return result;
}
Небольшой комментарий.
Основную работу выполняют следующие 3 функции:
1. Создаем ключ хранения исходя из 12-ти байтовой «соли» и пароля.
make_pwd_key(pwd_key, salt12, 12, passw);
2. Расшифровываем основной ключ на ключе хранения.
key_with_mask = decode_primary_key(pwd_key, primary_key, ctx);
3. Делим ключ с маской на маску.
raw_key = remove_mask_and_check_public(oid_param_set8, key_with_mask, mask, public8, ctx);
Но так как в библиотеке OpenSLL операция деления по модулю традиционно отсутствует, пользуемся операцией взятия обратного числа и умножением.
if (!BN_mod_inverse(mask_inv, mask, order, ctx)) { result = 1; goto err; }
if (!BN_mod_mul(raw_secret, key_with_mask, mask_inv, order, ctx)) { result = 1; goto err; }
Создание подписанного документа
Подписать можно абсолютно любой файл.
Перейдите в пункт “Создание подписи”
Нажмите на кнопку “Выбрать файл для подписи” и выберите файл, который нужно подписать.
Выберите подпись, которой необходимо подписать документ. Обратите внимание – ЭЦП должно быть актуальной.
После выбора ЭЦП станет активной кнопка “Подписать”. Необходимо её нажать. Если документ подписан и нет ошибок – под кнопкой “подписать появится соответствующая надпись. Либо будет указана ошибка с кодом.
Далее перейдите в папку, где хранился подписываемый документ, в нем будет два файла – сам документ и его подпись. Размещать или пересылать необходимо оба документа.
Установка сертификатов
Используя Инструменты КриптоПро, перейдите в пункт меню “Сертификаты” и установите сертификат Федерального казначейства в “доверенные корневые центры сертификации”.
Затем повторите процедуру для ЭЦП сотрудника, выбрав место установки сертификата “Личное”. Подготовка завершена.
Глава вторая
Порывшись в почте, я нашел еще один электронный договор. По счастливой случайности, им тоже оказался страховой полис, но на этот раз еОСАГО от АО “Тинькофф Страхование”. Открываем сертификат, смотрим выпустившую сертификат организацию. Ей оказывается АО “Тинькофф банк”. Да, оказывается у них есть свой УЦ, который выдает сертификаты дочерним организациям (у Сбербанка тоже есть свой УЦ, но в дочерних структурах он не используется).
По отработанному алгоритму идём в поисковую систему с запросом “тинькофф сертификат”, находим официальный сайт УЦ АО Тинькофф Банк. Тут нас встречает изобилие ссылок на корневые сертификаты, списки отозванных сертификатов и даже видеоинструкция по их установке. Скачиваем “Цепочка корневых сертификатов УЦ АО Тинькофф Банк ГОСТ Р 34.10.2012”, на этот раз ссылка ведёт не на сторонний сервис, а на сайт банка. Формат файла P7B не очень известный, но открывается Windows без установки стороннего софта и показывает находящиеся в нём сертификаты. Здесь уже привычный корневой сертификат от Минкомсвязи (другой, не тот, что в первом случае) и промежуточный сертификат УЦ банка.
Ставим оба, проверяем сертификат в полисе. Но нет, сертификат не является доверенным, т.к. система не может подтвердить поставщика сертификата. На сайте УЦ было 2 ссылки на 2 цепочки сертификатов, один для ГОСТ Р 34.10.2001, другой для ГОСТ Р 34.10.2012. Полис был выпущен в этом году, логичнее бы его подписать уже более современным криптоалгоритмом (тем более уже есть версия ГОСТ от 2018 года, алгоритмы обновляются довольно часто), но давайте проверим старый.
В новом файле формата P7B оказывается уже 3 файла сертификатов. Можно поставить все 3, однако стоит заметить, что сертификат “Головного удостоверяющего центра” мы поставили в первой главе из RAR архива ООО “ИТК”, они идентичны. А сертификат с не очень говорящим названием “УЦ 1 ИС ГУЦ” поставил КриптоПро CSP, т.к. галочка об установке корневых сертификатов была установлена по-умолчанию в его инсталляторе. Единственным новым является сертификат АО “Тинькофф Банк”, который мы и ставим.
После установки сертификатов из “Цепочка корневых сертификатов УЦ АО Тинькофф Банк ГОСТ Р 34.10.2001” путь в сертификате прорисовался и система радостно сообщила, что он является доверенным. Adobe Acrobat Reader DC также подтвердил, что подпись действительна.
На этом приключения с проверкой ЭП на полисе еОСАГО завершаются. Заметно, что после того, как в системе уже установлен необходимый софт, а пользователь понимает принципы работы и поиска промежуточных сертификатов, то проверка подписи занимает уже меньше времени.
Но проблемные места по-прежнему видны: необходимо искать в интернете официальные сайты удостоверяющих центров, разбираться в инструкциях по установке сертификатов. Даже при установленных корневых сертификатах необходимо искать промежуточный, иначе цепочка доверия будет не полной и система не сможет подтвердить достоверность подписи.
Файл masks. key
Содержит 32 байта маски ключа в формате Asn1, зашифрованного на ключе хранения pwd_key. Далее 12 байт «затравочной» информации для генерации ключа хранения pwd_key, если криптоконтейнер защищен паролем, то пароль также участвует в генерации ключа хранения.
Далее контрольная сумма (имитозащита) 4 байта. Контрольной информацией для простоты мы пользоваться не будем, общий контроль будет осуществляться путем генерации открытого ключа и сравнения первых 8 байт полученного ключа с соответствующим полем из файла header.key:
Сборка утилиты конвертирования ключа
Далее сборка исходников описана для Linux версии.
Версию для Windows можно скачать отсюда там же есть сертификаты и закрытый ключ для тестирования, для сборки потребуется бесплатный компилятор Borland C++ 5.5
Компиляция OpenSSL библиотеки
После скачивания и распаковки исходных текстов openssl в целевой директории выполняем команды:
./config
make
Получаем готовую библиотеку libcrypto.a в текущей директории.
Также потребуются заголовочные файлы из директорий engines/ccgost и include.
Компиляция privkey
gcc -o privkey -Iengines/ccgost -Iinclude privkey.c libcrypto.a -pthread -ldl
Формирование файла закрытого ключа private. key
./privkey /mnt/usbflash/lp-9a0fe.000
Тестовый закрытый ключ в криптоконтейнере lp-9a0fe.000, сертификат открытого ключа signer.cer и другие файлы для тестирования можно взять отсюда
Получаем результат работы:
-----BEGIN PRIVATE KEY-----
MEYCAQAwHAYGKoUDAgITMBIGByqFAwICJAAGByqFAwICHgEEIwIhAKzsrv/l1Uwk
uzph/LQN9mux0Jz0yaW21kOYEFv0Xyut
-----END PRIVATE KEY-----
Cохраняем в private.key
Пользуемся закрытым ключом private. key для подписывания файла file. txt
openssl cms -sign -inkey private.key -in file.txt -CAfile CA.cer -signer signer.cer -engine gost -out test.sign -outform DER -noattr -binary
Проверяем подпись
openssl cms -verify -content file.txt -in test.sign -CAfile CA.cer -signer signer.cer -engine gost -inform DER -noattr -binary
Все работает просто замечательно!
Спасибо за внимание. Это была моя первая статья на хабре.
Немного про корневые и промежуточные сертификаты
Проделав всю эту работу, меня не покидало чувство, что вся система построена не очень безопасно, требует от пользователя кучу дополнительных операций и доверия многим факторам: от поисковой системы, которая может не выдать первой строкой официальный сайт УЦ, до работы самого персонала УЦ, который выкладывает сертификаты без контрольных сумм на сторонние веб сервисы в проприетарных форматах контейнеров.
За дополнительной информацией я пошёл на сайт Минкомсвязи и нашёл такую страницу. Там можно скачать XLS файл, в котором будут перечислены все имеющие в настоящий момент аккредитацию УЦ, а также УЦ с приостановленной и прекращенной аккредитацией. В списке аккредитованных находится 494 УЦ, что немало.
Однако просто списка недостаточно, нужны хотя бы ссылки на сайты этих УЦ, а также надо найти корневые сертификаты непосредственно от первоисточника, Минкомсвязи. Следующий точкой в поиске этой информации стал портал pravo.gov.ru, где перечислены ссылки на некоторые корневые сертификаты. Страница доступна только по http протоколу, контрольных сумм опять нет.
Приглядевшись, можно заметить, что первые 4 ссылки ведут на портал https://e-trust.gosuslugi.ru. Не совсем понятно, почему именно поддомен сайта госуслуг стал центральным в системе корневых сертификатов, но, кажется, тут приведена вся актуальная информация по корневым и промежуточным сертификатам.
На странице головного УЦ https://e-trust.gosuslugi.ru/MainCA приведены 10 корневых сертификатов от Минкомсвязи, для разных ГОСТ алгоритмов и с разными сроками действия. Тут же доступны слепки ключей, можно проверить, что скачанный сертификат никто не подменил. Сам сайт имеет сертификат от Thawte.
На странице аккредитованных УЦ https://e-trust.gosuslugi.ru/CA находится полный список промежуточных удостоверяющих центров, можно скачать их сертификаты, проверить слепок. Кроме этого вся информация доступна в формате XML. Одним разом можно получить файл с данными о всех промежуточных УЦ, а также их сертификаты и ссылки для получения списка отозванных сертификатов.
У сертификатов есть поле точки распространения списка отзывов (CRL), в котором прописан путь получения списка отозванных сертификатов. При проверке ЭП на каком-то документе кроме установки промежуточного и корневых сертификатов нужно также установить и последний список отозванных и обновлять его перед каждой проверкой (данная процедура автоматизируется специализированным софтом, но штатные средства вроде бы так не умеют). На портале e-trust у каждого сертификата указан путь к такому списку и он может отличаться от того, что написано в самом сертификате. Чему верить? Не совсем понятно.
В заключение статьи хочется отметить, что проверка ЭП на электронных документах по силам каждому, однако это не совсем тривиальный процесс, требующий некоторых знаний. Возможно, что в будущем этот процесс упростится. Кроме этого остается открытым вопрос проверки ЭП на мобильных устройствах, а ведь они сейчас стали основным инструментом пользователей, давно опередив персональные компьютеры.
После написания статьи осталось несколько открытых вопросов, которые хотелось бы обсудить с сообществом:
- аналоги КриптоПро, особенно opensource инструменты для создания и проверки ЭП;
- добавление валидации ЭП не только в Adobe Acrobat Reader DC, но и в Foxit Reader и другие;
- оставшиеся за пределами данной статьи проблемы, которые также важны и требуют внимания, но не проявились в моём случае.
UPD 0: В комментариях подсказали онлайн сервис на портале госуслуг для проверки ЭП документов: https://www.gosuslugi.ru/pgu/eds. К сожалению, не заработало в моём случае, но может быть полезно.
UPD 1: После написания статьи мне подсказали, что есть ещё один криптопровайдер, ViPNet CSP, который тоже может помочь с ГОСТовскими криптоалгоритмами в системе. Одновременная установка его с КриптоПро CSP под вопросом.
КДПВ: edar, Pixabay
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Всегда-ли вы проверяете ЭЦП в полученных электронных документах?
Проголосовали 70 пользователей.
Воздержались 28 пользователей.
Как подписать документ в КриптоАРМ — видеоинструкция
https://youtube.com/watch?v=Z_itcGVCvI4
Материал актуален на 10.01.2022
Интересные статьи
Удостоверяющий центр
Как подписать документ невидимой подписью
Как подписать документ видимой подписью
Как проверить, действительна ли подпись
Чтобы подписать документ в Word или Excel электронной подписью, нужно установ…
Удостоверяющий центр
Что такое генерация закрытого ключа электронной подписи
Особенности генерации ключа электронной подписи
Как сгенерировать неквалифицированную электронную подпись на сайте ФНС России: пошаговая инструкция
…
Удостоверяющий центр
Как отозвать электронную подпись юридическому лицу и ИП
Как отозвать электронную подпись физическому лицу
В каких случаях нужно отозвать электронную подпись
Если кратко
Отзыв электронной п…
Инструкция по созданию файла, подписанного ЭЦП, с использованием ПО КриптоПро

Для собственного использования создал инструкцию для подведов. Буду рад, если кому-нибудь пригодится в работе. Ниже представлен текст с картинками из инструкции по созданию подписанного ЭЦП электронного документа, с использованием ПО КриптоПро. В самом конце приложена ссылка на исходник, он выполнен в виде Гугл документа, шаблон – брошюра, формат листа А4. Его можно использовать по своему усмотрению.
Инструменты КриптоПро
Для работы с ЭЦП запустите утилиту “Инструменты КриптоПро”. В ней собраны все необходимые инструменты для работы с ЭЦП
Для работы можно использовать ЭЦП, выданную Казначейством района Для этого необходимо скачать и установить корневой сертификат Федерального казначейства РФ по ссылке. Так как это корневой сертификат, то и установить его необходимо в хранилище корневых сертификатов.