Мы опишем установку сертификата электронной подписи и закрытого ключа для ОС семейства Windows. В процессе настройки нам понадобятся права Администратора (поэтому нам может понадобится сисадмин, если он у вас есть).
Если вы еще не разобрались что такое Электронная подпись, то пожалуйста ознакомьтесь вот с этой инструкцией. Или если еще не получили электронную подпись, обратитесь в Удостоверяющий центр, рекомендуем СКБ-Контур.
Хорошо, предположим у вас уже есть электронная подпись (токен или флешка), но OpenSRO сообщает что ваш сертификат не установлен, такая ситуация может возникнуть, если вы решили настроить ваш второй или третий компьютер (разумеется подпись не «прирастает» только к одному компьютеру и ее можно использовать на нескольких компьютерах). Обычно первоначальная настройка осуществляется с помощью техподдержки Удостоверяющего центра, но допустим это не наш случай, итак поехали.
- 1. Убедитесь что КриптоПро CSP 4 установлен на вашем компьютере
- 2. Если у вас токен (Рутокен например)
- 3. Если закрытый ключ в виде файлов
- 4. Установка сертификата из закрытого ключа
- 5. Использование электронной подписи без токена или флешки (установка в реестр)
- [faq] – перенос криптопро, ключей эцп, сертификатов с одного компьютера на другой
- Копирование подписи
- Копирование подписи через “Подпись Про” / модуль “Удостоверяющий центр”
- Установка подписи
- Установка подписи через “Подпись Про” / модуль “Удостоверяющий центр”
- Импорт ключей и сертификатов
- Как быть если доступ к старой системе невозможен?
- Экспорт ключей и сертификатов
- Что такое открытый ключ ЭЦП
- Инструкция как экспортировать открытый ключ
- Экспорт открытого ключа из КриптоПро CSP
- Что такое закрытый ключ ЭЦП
- Инструкция как экспортировать закрытый ключ
- Зачем копировать сертификаты ЭЦП
- Способы копирования ЭЦП
- Извлечение сертификата из контейнера
- Копирование закрытого ключа в реестр
- Копирование при помощи мастера экспорта ключей
- Массовое копирование
- Как привязать сертификат к контейнеру
- Ошибка при копировании контейнера
- Экспорт ключей и сертификатов
- Импорт ключей и сертификатов
- Как быть если доступ к старой системе невозможен?
- Файл primary. key
- Файл masks. key
- Файл header. key
- Читаем закрытый ключ и конвертируем
- Сборка утилиты конвертирования ключа
- Компиляция OpenSSL библиотеки
- Компиляция privkey.c
- Формирование файла закрытого ключа private.key
- Пользуемся закрытым ключом private.key для подписывания файла file.txt
- Проверяем подпись
- Перенос ключей КриптоПро CSP
1. Убедитесь что КриптоПро CSP 4 установлен на вашем компьютере
Для этого зайдите в меню Пуск КРИПТО-ПРО КриптоПро CSP запустите его и убедитесь что версия программы не ниже 4-й.

2. Если у вас токен (Рутокен например)
Прежде чем система сможет с ним работать понадобится установить нужный драйвер.
- Драйверы Рутокен: https://www.rutoken.ru/support/download/drivers-for-windows/
- Драйверы eToken: https://www.aladdin-rd.ru/support/downloads/etoken
- Драйверы JaCarta: https://www.aladdin-rd.ru/support/downloads/jacarta
Алгоритм такой: (1) Скачиваем; (2) Устанавливаем.
Для токена может понадобиться стандартный (заводской) пин-код, здесь есть стандартные пин-коды носителей.
3. Если закрытый ключ в виде файлов
Закрытый ключ может быть в виде 6 файлов: header.key, masks.key, masks2.key, name.key, primary.key, primary2.key
(Если вы не боитесь командной строки, то съемный носитель можно сэмулировать примерно так: subst x: C:\tmp появится новый диск (X:), в нем будет содержимое папки C:\tmp, он исчезнет после перезагрузки. Такой способ можно использовать если вы планируете установить ключи в реестр)
Нашли файлы, записали на флешку, переходим к следующему шагу.
4. Установка сертификата из закрытого ключа
Теперь нам нужно получить сертификат, сделать это можно следующим образом:
- Открываем КриптоПро CSP
- Заходим на вкладку Сервис
- Нажимаем кнопку Просмотреть сертификаты в контейнере, нажимаем Обзор и здесь (если на предыдущих шагах сделали все правильно) у нас появится наш контейнер. Нажимаем кнопку Далее, появятся сведения о сертификате и тут нажимаем кнопку Установить (программа может задать вопрос проставить ли ссылку на закрытый ключ, ответьте «Да»)
- После этого сертификат будет установлен в хранилище и станет возможным подписание документов (при этом, в момент подписания документа, нужно будет чтобы флешка или токен были вставлены в компьютер)
5. Использование электронной подписи без токена или флешки (установка в реестр)
Если скорость и удобство работы для вас стоит чуть выше чем безопасность, то можно установить ваш закрытый ключ в реестр Windows. Для этого нужно сделать несколько простых действий:
- Выполните подготовку закрытого ключа, описанную в пунктах (2) или (3)
- Далее открываем КриптоПро CSP
- Заходим на вкладку Сервис
- Нажимаем кнопку Скопировать
- С помощью кнопки Обзор выбираем наш ключ
- Нажимаем кнопку Далее, потом придумаем какое-нибудь имя, например «Пупкин, ООО Ромашка» и нажимаем кнопку Готово
- Появится окно, в котором будет предложено выбрать носитель, выбираем Реестр, жмем Ок
- Система попросит Установить пароль для контейнера, придумываем пароль, жмем Ок
Чтобы для сертификата проставить ссылку на этот закрытый ключ выполните действия из пункта (4).
Важное замечание: портал OpenSRO не «увидит» сертификат, если вышел срок его действия.
[faq] – перенос криптопро, ключей эцп, сертификатов с одного компьютера на другой
Инструкция по переносу лицензии КриптоПро, закрытых ключей ЭЦП и сертификатов с одного компьютера на другой.
1. Перенос лицензии криптопро.
Серийный номер КриптоПро CSP 3.6 находится в ветке реестра
в значении параметра ProductID (имя раздела 05480A45343B0B0429E4860F13549069 может оказаться другим).
2. Перенос закрытых ключей ЭЦП. (Имеются ввиду ЭЦП хранящиеся в реестре, для ключей хранящихся на флешках, и токенах действие не требуется.)
2.1 Узнать SID текущего пользователя (нужен пользователь у которого ключи).
Способ 1: командой
Способ 2:Найти ветку реестра
Выбрать SID (имеет вид, например, S-1-5-21-1993962763-492894223-1202660629-6195), и посмотреть ProfileImagePath, в конце строки найдете имя пользователя, которому принадлежит этот SID.
2.2. Для 32 битных систем нужно экспортировать ветку
Для 64-битных систем нужно экспортировать ветку
) , которая позволяет запускать процессы от имени системной учетки. С помощью psexec запускаем regedit от имени системы:
и нам становятся доступны все разделы. Этот же трюк спасет если система вообще не загружается, нужно скопировать файл КриптоПро
и загрузить его как куст реестра, главное, чтобы файл не был поврежден.
В reg-файле меняем через автозамену SID_текущего_пользователя, на SID пользователя в новой сисмеме.
. Запускаем reg-файл, после этого все готово, но необходимо будет заново установить личные сертификаты для того что бы привязать сертификаты к контейнерам. Если не видно контейнеров, то неправильно указали SID_пользователя, т.к. контейнеры видны только под тем пользователем, под SID’ом которого они находятся.
3. Перенос сертификатов.
Способ 1. Экспорт-импорт сертификатов. Выполнить
Панель управления -> КриптоПро -> вкладка «Сервис» -> «Установить личный сертификат».
При установке личных сертификатов средствами Windows не выполняется привязка закрытого ключа ЭЦП, и, очевидно, работать ничего не будет.
Способ 2. Установка сертификатов из контейнеров ЭЦП.
При установке личного сертификата в КриптоПро версии 3.6 и выше существует возможность скопировать сертификат в контейнер закрытого ключа. Данная процедура позволяет значительно облегчить процесс переноса. Если сертификат установлен в контейнер закрытого ключа, не нужно ни чего экспортировать, достаточно просто перенести контейнеры, а потом зайти в
Панель управления -> КриптоПро -> вкладка «Сервис» ->»Просмотреть сертификаты в контейнере»
выбрать нужный контейнер и нажать кнопки «Далее» и «Установить».
Копирование подписи
Если возникла потребность установить подпись еще на одном компьютере, то в первую очередь необходимо выполнить копирование контейнера закрытого ключа, а также сертификата с компьютера, на котором данная подпись уже установлена.
Выполнить копирование сертификата можно через программу «Подпись Про» (либо модуль «Удостоверяющий центр» программы «Полигон Про») или через программу КриптоПро CSP.
Копирование подписи через “Подпись Про” / модуль “Удостоверяющий центр”
1) На ленте на вкладке “Главная” нажмите кнопку “Резервное копирование”.
2) Выберите необходимый контейнер и введите пароль (если он был установлен).
Примечание: если установлена галочка «По сертификату», поиск осуществляется по ФИО владельца или наименованию организации.
3) Укажите имя и пароль нового контейнера и нажмите “ОК”.
4) Запустится программа «КриптоПро CSP», следуя подсказкам, закончите копирование.
Установка подписи
Скопированную подпись необходимо установить. Сделать это можно через программу “Подпись Про” (либо модуль “Удостоверяющий центр” программы “Полигон Про”) или через программу КриптоПро CSP.
Установка подписи через “Подпись Про” / модуль “Удостоверяющий центр”
1) Нажмите кнопку “Установить” у выбранного сертификата:
Сертификат будет успешно установлен – программа сообщит об этом:
Также можно установить сертификат с помощью кнопки на ленте “Установить сертификат” и выбрать нужный сертификат:
Импорт ключей и сертификатов
Прежде всего установим на новый узел КриптоПро, обратите внимание, что переносить ключи и сертификаты следует между одинаковыми версиями. В противном случае либо обновите версию КриптоПро на старой системе, либо установите старую версию на новой и обновите ее уже после переноса ключевых пар.
Затем снова узнаем SID пользователя, который будет работать с ЭЦП, если это текущий пользователь, то снова выполните:
Как быть если доступ к старой системе невозможен?
Теория – это хорошо, но практика может подкинуть самые неожиданные ситуации. Как быть, если доступ к старой системе невозможен? Скажем вышла из строя материнская плата или серьезно повреждена операционная система?
Все что нам нужно в таком случае – это доступ к файловой системе старой системы. Вы можете как напрямую подключить жесткий диск к новой системе, так и загрузиться при помощи консоли восстановления или любого более продвинутого инструмента, скажем MSDaRT.
С копированием сертификатов проблемы возникнуть не должно, их хранилище простая папка на диске, а вот с хранилищем закрытых ключей в реестре немного сложнее. Но не будем забывать, что системный реестр тоже хранится в файлах на диске. Вам следует любым доступным образом скопировать файл SOFTWARE из C:WindowsSystem32config
![]()
Затем на целевой системе откройте редактор реестра, перейдите в раздел и через Файл – Загрузить куст подключите скопированный из старой системы раздел реестра. Дайте ему осмысленное имя, скажем OLD_SOFTWARE.![]()
После чего пройдите в раздел с закрытыми ключами (с учетом новой точки монтирования) и выполните экспорт ветки .![]()
Дальнейшие действия ничем не отличаются от описанных нами в разделе Импорт ключей и сертификатов.
Экспорт ключей и сертификатов
Для того, чтобы правильно экспортировать закрытые ключи, нам нужно выяснить идентификатор безопасности (SID) текущего пользователя (который работает с ЭЦП), это можно сделать командной:
Квалифицированная электронная подпись состоит из открытого и закрытого ключа. Обе составляющие создаются с помощью криптографических алгоритмов. Для работы с КЭП нужно использовать оба ключа — каждый из них выполняет свою функцию.
Что такое открытый ключ ЭЦП
Открытый ключ электронной подписи представляется в виде электронного сертификата или бумажного документа. Сертификат выдаётся только удостоверяющим центром и содержит информацию, которая используется для проверки подписи владельца и шифрования данных.
Открытый ключ можно использовать для работы с партнёрами, в отличие от закрытого, который хранится в защищённом месте. Контрагенты могут использовать открытый ключ владельца для шифрования данных, которые ему посылают. Это означает, что после отправки этих данных, получить доступ к ним сможет только владелец закрытой части ключа.
Сертификат содержит в себе следующие данные:
срок действия сертификата;
реквизиты удостоверяющего центра;
ФИО владельца сертификата;
название криптографического алгоритма;
Электронный сертификат виден на обычных носителях в виде файла с расширением .cer, а на защищённых картах Рутокен, eToken и JaCarta он скрыт. Чтобы увидеть скрытый сертификат, его необходимо экспортировать.
Инструкция как экспортировать открытый ключ
Экспортировать открытый ключ электронной подписи можно через свойства обозревателя либо из криптопровайдера КриптоПро CSP. При этом носитель с ключом должен быть подключён к компьютеру.
Экспорт открытого ключа через свойства обозревателя

2. Перейдите на вкладку «Содержание» и нажмите на кнопку «Сертификаты».

3. В списке выберите нужный сертификат, щёлкнув по его названию, и нажмите кнопку «Экспорт».

4.В окне «Мастер экспорта сертификатов» нажмите кнопку «Далее», затем «Нет, не экспортировать закрытый ключ» и снова «Далее».

5. В окне «Формат экспортируемого файла» выберите «Файлы в DER-кодировке X.509 (.CER)» и нажмите кнопку «Далее».


Экспорт открытого ключа из КриптоПро CSP

2. Перейдите на вкладку «Сервис» и нажмите кнопку «Просмотреть сертификаты в контейнере».


4. В окне «Сертификат для просмотра» нажмите кнопку «Свойства».

5. Перейдите на вкладку «Состав» и нажмите кнопку «Копировать в файл».
6. В окне «Мастер экспорта сертификатов» нажмите кнопку «Далее», затем «Нет, не экспортировать закрытый ключ» и снова «Далее».

7. В окне «Формат экспортируемого файла» выберите «Файлы в DER-кодировке X.509 (.CER)» и нажмите кнопку «Далее».


Что такое закрытый ключ ЭЦП
Закрытый ключ представлен в виде уникального набора символов, которые используются криптографическим алгоритмом для создания защищённой части электронной подписи.
Владелец электронной подписи использует именно закрытую часть для подписания электронных документов. Любой, кто получает доступ к закрытому ключу электронной подписи, может им воспользоваться. Поэтому его хранят на защищённых носителях: смарт-карте, токене, USB-носителе или дискете.
Хранить закрытый ключ можно на компьютере, однако это небезопасно — воспользоваться им сможет любой, кто имеет доступ к компьютеру. Самым защищённым носителем считается смарт-карта, так как на ней используется двухфакторная аутентификация.
Как и в случае с сертификатом, закрытый ключ может быть как скрыт так и виден, в зависимости от носителя. Он представлен в виде папки, которая содержит несколько файлов с расширением .key, поэтому закрытый ключ также называют контейнером. Скрытый контейнер с закрытым ключом нужно экспортировать, чтобы получить к нему прямой доступ.
Инструкция как экспортировать закрытый ключ
Выполнять экспорт закрытого ключа электронной подписи можно из криптопровайдера КриптоПро CSP.
Перейдите на вкладку «Сервис» и нажмите на кнопку «Скопировать контейнер».
Если вы копируете закрытый ключ с защищённого носителя, введите pin-код.
Введите название копии закрытого ключа и нажмите «Готово».
В окне «Выбор ключевого носителя» выберите носитель, на который будет произведено копирование контейнера с закрытым ключом.
Установите пароль на контейнер. Несмотря на то что этот шаг необязательный, установка пароля обеспечит дополнительную защиту.







Открытый и закрытый ключи квалифицированной электронной подписи выполняют разные функции, но для работы нужны обе части. В некоторых случаях владельцу ЭЦП нужно сделать экспорт на другой носитель, воспользоваться он может как средствами Windows, так и криптопровайдером КриптоПро CSP.
Квалифицированная электронная подпись (ЭЦП) выдается пользователю на специальном USB-носителе или токене. Он подключается к любому ПК или ноутбуку и отвечает всем требованиям безопасности. Но в некоторых случаях пользователю удобнее работать с закрытым ключом ЭЦП, расположенным на компьютере, а для этого нужно скопировать контейнер с сертификатом.
Зачем копировать сертификаты ЭЦП
Перенос ключей и сертификатов электронной подписи необходим в нескольких случаях. Первый из них — работа с ЭЦП сразу на нескольких ПК. Переставлять флешку с ключом не всегда удобно, поэтому пользователи предпочитают иметь копию на рабочем столе. Вторая причина для создания резервной копии — возможность потери или порчи USB-носителя. Это относится к людям, часто и много путешествующим, и работающим из нескольких точек. Необходимость копирования закрытого ключа есть и в случае создания виртуального сервера, к которому будут иметь доступ сразу несколько организаций.

Способы копирования ЭЦП
Существует несколько способов, как выгрузить сертификаты ЭЦП на рабочий стол. Для этого можно использовать программу КриптоПро, проводник Windows или консоль.
Извлечение сертификата из контейнера
Как извлечь сертификат из контейнера закрытого ключа:
- Запустить КриптоПро CSP.
- Перейти во вкладку «Сервис».
- Нажать «Посмотреть сертификаты в контейнере».

- Нажать «Обзор».

- В новом окне будет список контейнеров закрытого ключа, из которого выбирают нужный, и нажимают «ОК».

- Затем нажать «Далее».

- При необходимости ввести pin-код и нажать «ОК».

- В открывшемся окне необходимо нажать кнопку «Свойства».

- Перейти на вкладку «Состав» и нажать кнопку «Копировать».

- В новом окне нажимают «Далее» и выбирают пункт «Не экспортировать закрытый ключ».

- В следующем рабочем окне выбирают первый пункт кодировки.

- Затем нажимают «Обзор», выбирают путь сохранения сертификата и указывают имя файла, нажимают «Сохранить».

Для завершения процесса нужно нажать на кнопку «Далее», затем «Готово».
Копирование закрытого ключа в реестр
Экспортировать закрытый ключ вместе с сертификатом можно и в реестр, а оттуда — переместить на рабочий стол или в любое удобное место на ПК. Для этого также используется программа КриптоПро.
- Запустить КриптоПро, открыть меню «Сервис» и нажать «Копировать».

- В новом окне выбрать контейнер, где хранятся закрытые ключи.

- Нажать «Далее» и перейти к копированию контейнера, а в поле «Имя контейнера» ввести название ЭЦП.

- Затем выбрать «Реестр».

Для установки скопированного сертификата нужно:
- Еще раз открыть КриптоПро и во вкладке «Сервис» выбрать «Посмотреть сертификаты в контейнере».

- Через «Обзор» выбрать нужный сертификат.

- Проверить данные сертификата, срок действия и фио или иные данные.

- Последовательно нажать «Установить», «Да», «Ок».
Экспорт сертификата с закрытым ключом прошел успешно, и теперь для работы с ЭЦП не нужно больше подключать носитель.
Копирование при помощи мастера экспорта ключей
Есть еще один способ переноса электронной подписи на компьютер. Для этого необходимо проделать следующие действия:
- Проделать путь «Пуск», «Панель управления», «Свойства обозревателя».

- Выбрать вкладку «Содержание», после чего через кнопку «Сертификаты» перейти во вкладку «Личные», а в открывшемся списке найти сертификат, который необходимо скопировать. Нажать «Экспорт».

- В открывшемся мастере экспорта сертификатов нажимают «Далее».

- Поставить нужные галочки.

- Выбрать первый пункт (файлам с расширением Х.509).

- Через «Обзор» выбрать место, куда необходимо сохранить закрытый ключ.

- Нажать последовательно «Далее» и «Готово».


После копирования закрытого ключа использовать электронную подпись можно также без предварительного подключения USB-носителя.
Массовое копирование
Чтобы перенести сразу несколько ключей ЭЦП на другой компьютер или на любой другой носитель, проще использовать консольный метод.
Затем пользователь выбирает и экспортирует папку Keys.

Остается лишь запустить файл с расширением .reg и загрузить данные в реестр. После этого пользователь копирует папку с сертификатами на другой компьютер.
Как привязать сертификат к контейнеру
Для привязки сертификата ключа электронной подписи к контейнеру нужно:
- Через «Панель управления» перейти к КриптоПро и выбрать «Свойства»/«Сервис»/«Установить личный сертификат».

- В мастере установки через «Обзор» выбрать сертификат.

- Затем в мастере установки нажать «Далее».

- Еще раз нажать «Далее».

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

- При необходимости сертификат можно поместить в личное хранилище или любое другое место на ПК.

- Нажать «Готово».

На этом привязка сертификата к контейнеру завершена.
Ошибка при копировании контейнера
Чтобы перенести сертификат с токена придется воспользоваться другим способом. Через IE пользователь открывает «Содержание» через «Настройки».

Затем нужно выбрать сертификат и нажать «Экспорт».

В новом окне пользователь выбирает экспортирование закрытого ключа и проставляет все нужные галочки.

Далее нужно указать пароль, т.к. без него продолжать нельзя. А также пользователю нужно указать имя файла и место, куда нужно сохранить закрытый ключ. Остается лишь скопировать сертификат. Для этого нужно выбрать сертификат в списке, нажать «Экспорт» и выбрать файл .CER.
При правильной последовательности появляются два файла: .pfx и .cer.
Для завершения копирования нужно лишь перенести эти файлы на другой компьютер или носитель и запустить их установку при помощи мастера установки сертификатов.
Копирование закрытого ключа электронной подписи нужно в нескольких случаях: при частых путешествиях и в работе с нескольких ПК. Также перенести ключ ЭЦП на рабочий стол можно и для того, чтобы избежать порчи и потери USB-носителя. Процесс копирования проходит в несколько последовательных шагов, а выбрать можно для этого любой удобный способ. Это может быть простое извлечение ключа из закрытого контейнера, копирование при помощи КриптоПро или системный проводник. Ошибки при работе могут возникнуть только в случае защищенного от экспорта сертификата. Тогда пользователю придется произвести копирование при помощи браузера Internet Explorer.
https://youtube.com/watch?v=pdWwLv6sor4%3Ffeature%3Doembed
Если для работы используется дискета или flash-накопитель, скопировать контейнер с сертификатом можно средствами Windows (этот способ подходит для версий КриптоПро CSP не ниже 3.0). Папку с закрытым ключом (и, если есть, файл сертификата — открытый ключ) поместите в корень дискеты / flash-накопителя (если поместить не в корень, то работа с сертификатом будет невозможна). Название папки при копировании рекомендуется не изменять.
В папке с закрытым ключом должно быть 6 файлов с расширением.key. Как правило, в закрытом ключе присутствует открытый ключ (файл header.key в этом случае будет весить больше 1 Кб). В этом случае копировать открытый ключ необязательно. Пример закрытого ключа — папки с шестью файлами и открытого ключа — файла с расширением.cer.
Если у вас MacOS, смотрите инструкцию «Как скопировать контейнер с сертификатом на MacOS».
Отчитайтесь легко и без ошибок. Удобный сервис для подготовки и сдачи отчётов через интернет. Дарим доступ на 14 дней в Экстерн!
1. Зайдите на профиль Диагностики «Копирования» по ссылке.
2. Вставьте носитель, на который необходимо скопировать сертификат.
3. На нужном сертификате нажмите на кнопку «Скопировать».

Если на контейнер был задан пароль — появится сообщение «Введите пароль для устройства с которого будет скопирован сертификат».

Введите пароль и нажмите на кнопку «Далее».
4. Выберите носитель, куда необходимо скопировать сертификат и нажмите «Далее».

5. Задайте имя новому контейнеру и нажмите на кнопку «Далее».

6. Должно появиться сообщение об успешном копировании сертификата.

- Скачайте и запустите утилиту. Дождитесь загрузки всего списка контейнеров/сертификатов и отметьте нужные галочками.
- Выберите меню Массовые действия и нажмите на кнопку Копирование контейнеров

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

4. После копирования нажмите внизу слева кнопку Обновить
Если хотите работать со скопированными контейнерами — необходимо установить сертификаты.
Отчитайтесь легко и без ошибок. Удобный сервис для подготовки и сдачи отчётов через интернет. Дарим доступ на 14 дней в Экстерн!
Выберите «Пуск» > «Панель управления» > «КриптоПро CSP». Перейдите на вкладку Сервис и кликните по кнопке Скопировать».

В окне Копирование контейнера закрытого ключа нажмите на кнопку Обзор.

Выберите контейнер, который необходимо скопировать, и кликните по кнопке «Ок», затем «Далее». Если вы копируете с рутокена, то появится окно ввода, в котором следует указать pin-код. Если вы не меняли pin-код на носителе, стандартный pin-код — 12345678.

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

В окне Вставьте чистый ключевой носитель выберите носитель, на который будет помещен новый контейнер.

На новый контейнер будет предложено установить пароль. Рекомендуем установить такой пароль, чтобы вам было легко его запомнить, но посторонние не могли его угадать или подобрать. Если вы не хотите устанавливать пароль, можно оставить поле пустым и нажать «ОК».
Не храните пароль/pin-код в местах, к которым имеют доступ посторонние. В случае утери пароля/pin-кода использование контейнера станет невозможным.

Если вы копируете контейнер на смарт-карту ruToken, сообщение будет звучать иначе. В окне ввода укажите pin-код. Если вы не меняли pin-код на носителе, стандартный pin-код — 12345678.

После копирования система вернется на вкладку «Сервис» КриптоПро CSP. Копирование завершено. Если вы планируете использовать для работы в Экстерне новый ключевой контейнер, установите его через Крипто Про.
При копировании может возникнуть «Ошибка копирования сертификата», если у вас нет лицензии на КриптоПроCSP или контейнер получил признак «неэкспортируемый». Справиться с этим поможет инструкция.
Экспорт сертификата с закрытым ключом
1. Откройте оснастку работы с сертификатами:
2. Откройте сертификат, который нужно скопировать. На вкладке «Состав» нажмите «Копировать в файл».

3. В «Мастере экспорта сертификтов» нажмите «Далее» и выберите пункт «Да, экспортировать закрытый ключ». Нажмите «Далее».

4. На следующем этапе поставьте галочки у пунктов «Включить по возможности все сертификаты в путь сертификации» и «Экспортировать все расширенные свойства», остальные галочки необходимо убрать. Нажмите «Далее».

5. Обязательно задайте пароль для экспортируемого файла. Данный пароль не рекомендуется сообщать по электронной почте. Нажмите «Далее».

6. Укажите имя файла, выберите путь сохранения и нажмите «Далее», затем нажмите «Готово».

7. Экспортируйте открытый ключ сертификата (см. Экспорт открытого ключа).
8. Заархивируйте полученные файлы форматов .pfx и .cer.
Установка сертификата с закрытым ключом
1. Откройте .pfx файл. Сразу запустится «Мастер импорта сертификатов».
2. Укажите хранилище «Текущий пользователь» и нажмите «Далее», затем снова «Далее».


4. Выберите пункт «Поместить все сертификаты в следующее хранилище», нажмите на кнопку «Обзор», выберите «Личное» и нажмите на кнопку «ОК». Нажмите «Далее», а затем «Готово».

5. В окне КриптоПро выберите носитель, на который хотите сохранить контейнер. При необходимости задайте пароль.

6. Для корректной работы сертификата со встроенной лицензией переустановите сертификат в контейнер (см. Как установить личный сертификат в КриптоПро).
Отчитайтесь легко и без ошибок. Удобный сервис для подготовки и сдачи отчётов через интернет. Дарим доступ на 14 дней в Экстерн!
1. Необходимо найти ветку реестра с нужным контейнером. Ветки реестра, в которых может быть контейнер закрытого ключа:
- для 32-битной ОС: HKEY_LOCAL_MACHINE\SOFTWARE\Crypto Pro\Settings\Users\*идентификатор пользователя*\Keys\*Название контейнера*;
- для 64-битной ОС: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Crypto Pro\Settings\USERS\*идентификатор пользователя*\Keys\*Название контейнера*.
2. После того, как нашли нужную ветку, нажмите правой кнопкой мыши на ветку с контейнером и выберите «Экспортировать».

3. Введите имя файла и нажмите на кнопку «Сохранить».
4. Скопируйте файл на тот компьютер, где будете работать с электронной подписью обычными средствами Windows.
5. Пройдите диагностику на сайте https://help.kontur.ru .
6. Как диагностика закончится, нажмите на ссылку «Показать результаты».

7. В списке результатов выберите «Информация о Windows». Скопируйте оттуда SID текущего пользователя.


8. Откройте экспортированный файл реестра с помощью «Блокнота».

9. Замените SID пользователя на скопированный ранее.

Если ветка реестра экспортируется из 32-битной ОС в 64-битную ОС, добавьте в путь ветки реестра параметр Wow6432Node как на скриншоте:

10. Сохраните изменения и закройте файл.
11. Снова нажмите на файл правой кнопкой мыши и выберите «Слияние». В появившемся окне нажмите «Да».

Должно появиться сообщение о том, что данные успешно внесены в реестр. Нажмите «ОК».

Если появляется сообщение «Ошибка при доступе к реестру», необходимо еще раз проверить все пути в файле на корректность. Также проверьте, чтобы в пути не было лишних пробелов, знаков.
12. После того, как данные будут внесены в реестр, необходимо вручную установить сертификат (см. Как установить личный сертификат).
КриптоПро один из наиболее широко используемых криптопровайдеров на территории Российской Федерации, он широко используется в системах электронного документооборота, сдачи отчетности и взаимодействия с государственными органами, поэтому встретить его можно практически в любой организации. По этой причине у системных администраторов часто встает вопрос его переноса на другой ПК. А так как криптография является для многих сложной и непонятной областью, то эта простая задача может вызвать некоторые затруднения.
Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном курсе по администрированию MikroTik. Автор курса, сертифицированный тренер MikroTik Дмитрий Скоромнов, лично проверяет лабораторные работы и контролирует прогресс каждого своего студента. В три раза больше информации, чем в вендорской программе MTCNA, более 20 часов практики и доступ навсегда.
В повседневной деятельности широко распространено понятие «сертификат», им оперируют все, от сотрудников удостоверяющих центров, то бухгалтеров, работающих с ЭЦП. Часто можно услышать что-то подобное: «нам купили в бухгалтерию новый компьютер, нужно перенести сертификаты». Но если подходить с точки зрения криптографии, то слово «сертификат» в данном случае употребляется неправильно. Вся современная криптография строится вокруг инфраструктуры открытых ключей (PKI), которая подразумевает наличие у каждого участника ключевой пары: открытого и закрытого ключа.
Закрытый ключ является секретным, с его помощью мы можем подписывать документы, шифровать информацию и т.д. и т.п. Закрытый ключ Усиленной квалифицированной электронной подписи (УКЭП) равнозначен нотариально заверенной подписи и его попадание в чужие руки может привести к самым тяжелым последствиям.
Открытый ключ, дополненный некоторыми дополнительными данными, выпускается в форме сертификата и является публично доступным, с его помощью можно проверить действительность цифровой подписи, выполненной закрытым ключом или убедиться в подлинности участника обмена электронными документами.
Поэтому, когда мы говорим о переносе «сертификатов», то подразумеваем необходимость перенести ключевую пару: закрытый ключ и сертификат, перенос одних только сертификатов не принесет успеха, криптография на новом узле работать не будет.
Выяснив этот момент, перейдем к хранилищам закрытых ключей. КриптоПро предполагает в таком качестве токены, флеш-накопители и системный реестр. Токены являются наиболее защищенными устройствами, извлечь закрытый ключ из них невозможно, и вы можете не опасаться несанкционированного копирования (для этого закрытый ключ должен быть помечен как неэкспортируемый). Флеш-накопители представляют некий компромисс между безопасностью и мобильностью, а реестр удобен в тех случаях, когда на одном ПК нужно одновременно работать с большим количеством ключей. И именно с ним связаны определенные сложности при переносе на другой узел.
Экспорт ключей и сертификатов
Для того, чтобы правильно экспортировать закрытые ключи, нам нужно выяснить идентификатор безопасности (SID) текущего пользователя (который работает с ЭЦП), это можно сделать командной:
Затем откроем редактор реестра и перейдем в ветку для 32-битных систем:
для 64-битных систем:
Найдем и раскроем раздел с SID текущего пользователя и экспортируем оттуда ветку Keys.
Обратите внимание, что данная ветка содержит закрытые ключи, поэтому следует принять все меры безопасности и не передавать файл экспорта по открытым каналам связи и вообще исключить к нему несанкционированный доступ посторонних лиц.
После чего скопируем все сертификаты, расположенные по пути
Это открытые ключи, никакой секретности они не представляют, поэтому просто копируем их любым доступным способом.
Импорт ключей и сертификатов
Прежде всего установим на новый узел КриптоПро, обратите внимание, что переносить ключи и сертификаты следует между одинаковыми версиями. В противном случае либо обновите версию КриптоПро на старой системе, либо установите старую версию на новой и обновите ее уже после переноса ключевых пар.
Затем снова узнаем SID пользователя, который будет работать с ЭЦП, если это текущий пользователь, то снова выполните:
В противном случае:
где Name — имя пользователя.
После чего откройте на редактирование файл реестра с экспортированными закрытыми ключами и замените в нем все вхождения старого SID на SID нового пользователя.
Сохраните файл и импортируйте его в реестр. Закрытые ключи перенесены, файл переноса в целях безопасности следует удалить.
Следующим шагом скопируйте сохраненные сертификаты в
После чего можно устанавливать и настраивать приложения работающие с криптографией, все будет работать.
Как быть если доступ к старой системе невозможен?
Теория — это хорошо, но практика может подкинуть самые неожиданные ситуации. Как быть, если доступ к старой системе невозможен? Скажем вышла из строя материнская плата или серьезно повреждена операционная система?
Все что нам нужно в таком случае — это доступ к файловой системе старой системы. Вы можете как напрямую подключить жесткий диск к новой системе, так и загрузиться при помощи консоли восстановления или любого более продвинутого инструмента, скажем MSDaRT.
С копированием сертификатов проблемы возникнуть не должно, их хранилище простая папка на диске, а вот с хранилищем закрытых ключей в реестре немного сложнее. Но не будем забывать, что системный реестр тоже хранится в файлах на диске. Вам следует любым доступным образом скопировать файл SOFTWARE из C:\Windows\System32\config
Затем на целевой системе откройте редактор реестра, перейдите в раздел HKEY_LOCAL_MACHINE и через Файл — Загрузить куст подключите скопированный из старой системы раздел реестра. Дайте ему осмысленное имя, скажем OLD_SOFTWARE.
После чего пройдите в раздел с закрытыми ключами (с учетом новой точки монтирования) и выполните экспорт ветки Keys.
Дальнейшие действия ничем не отличаются от описанных нами в разделе Импорт ключей и сертификатов.
Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном курсе по администрированию MikroTik. Автор курса, сертифицированный тренер MikroTik Дмитрий Скоромнов, лично проверяет лабораторные работы и контролирует прогресс каждого своего студента. В три раза больше информации, чем в вендорской программе MTCNA, более 20 часов практики и доступ навсегда.
Речь пойдет о файлах primary.key, masks.key и header.key, которые лежат в директории ххххх.000 на флешке. Данные файлы входят в состав криптоконтейнера закрытого ключа электронной подписи криптопровайдера КриптоПро, формат которого нигде не опубликован. Целью данной статьи является чтение контейнера и преобразование закрытого ключа в формат, который может быть прочитан в библиотеке OpenSSL. Долгое время было распространено ошибочное суждение, что достаточно сделать нечто вида (primary_key XOR masks_key) и мы получим закрытый ключ в чистом (raw) виде, однако забегая вперед, можно утверждать, что в КриптоПро было применено более сложное преобразование, в худшем случае состоящее из более чем 2000 (двух тысяч) операций хеширования.
Стоит упомянуть о существовании утилиты P12FromGostCSP которая позволяет конвертировать ключ в формат P12, доступный для работы с OpenSSL, но утилита имеет следующие существенные недостатки:
- Читает контейнер не напрямую, а через криптопровайдер, поэтому там, где кроме OpenSSL ничего нет, не работает.
- Если в свойствах ключа не отмечено, что ключ «экспортируемый», то конвертировать его невозможно.
- В демо версии не формирует файл с ключом, эта возможность присутствует только в платной версии.
Файл primary. key
Содержит 32 байта ключа в формате Asn1. Это только половина ключа, полный ключ получается при делении этого числа по модулю Q на маску. Поле, хранящее модуль Q в библиотеке OpenSSL имеет название order. Маска лежит в файле masks.key:

Файл masks. key
Содержит 32 байта маски ключа в формате Asn1, зашифрованного на ключе хранения pwd_key. Далее 12 байт «затравочной» информации для генерации ключа хранения pwd_key, если криптоконтейнер защищен паролем, то пароль также участвует в генерации ключа хранения.
Далее контрольная сумма (имитозащита) 4 байта. Контрольной информацией для простоты мы пользоваться не будем, общий контроль будет осуществляться путем генерации открытого ключа и сравнения первых 8 байт полученного ключа с соответствующим полем из файла header.key:

Файл 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 байт открытого ключа (подчеркнуто) для контроля правильности чтения закрытого.

Читаем закрытый ключ и конвертируем
#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);Но так как в библиотеке OpenSSL операция деления по модулю традиционно отсутствует, пользуемся операцией взятия обратного числа и умножением.
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; }Сборка утилиты конвертирования ключа
Далее сборка исходников описана для Linux версии.
Компиляция OpenSSL библиотеки
После скачивания и распаковки исходных текстов openssl в целевой директории выполняем команды:
./config
make Получаем готовую библиотеку libcrypto.a в текущей директории.
Также потребуются заголовочные файлы из директорий engines/ccgost и include.
Компиляция privkey.c
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Все работает просто замечательно!
Спасибо за внимание. Это была моя первая статья на хабре.

