Криптопро не копирует приватный ключ и Как экспортировать приватную и публичную часть ключа электронной подписи

Криптопро не копирует приватный ключ и Как экспортировать приватную и публичную часть ключа электронной подписи Хостинг

Мы опишем установку сертификата электронной подписи и закрытого ключа для ОС семейства Windows. В процессе настройки нам понадобятся права Администратора (поэтому нам может понадобится сисадмин, если он у вас есть).

Если вы еще не разобрались что такое Электронная подпись, то пожалуйста ознакомьтесь вот с этой инструкцией. Или если еще не получили электронную подпись, обратитесь в Удостоверяющий центр, рекомендуем СКБ-Контур.

Хорошо, предположим у вас уже есть электронная подпись (токен или флешка), но OpenSRO сообщает что ваш сертификат не установлен, такая ситуация может возникнуть, если вы решили настроить ваш второй или третий компьютер (разумеется подпись не «прирастает» только к одному компьютеру и ее можно использовать на нескольких компьютерах). Обычно первоначальная настройка осуществляется с помощью техподдержки Удостоверяющего центра, но допустим это не наш случай, итак поехали.

Содержание
  1. 1. Убедитесь что КриптоПро CSP 4 установлен на вашем компьютере
  2. 2. Если у вас токен (Рутокен например)
  3. 3. Если закрытый ключ в виде файлов
  4. 4. Установка сертификата из закрытого ключа
  5. 5. Использование электронной подписи без токена или флешки (установка в реестр)
  6. [faq] – перенос криптопро, ключей эцп, сертификатов с одного компьютера на другой
  7. Копирование подписи
  8. Копирование подписи через “Подпись Про” / модуль “Удостоверяющий центр”
  9. Установка подписи
  10. Установка подписи через “Подпись Про” / модуль “Удостоверяющий центр”
  11. Импорт ключей и сертификатов
  12. Как быть если доступ к старой системе невозможен?
  13. Экспорт ключей и сертификатов
  14. Что такое открытый ключ ЭЦП
  15. Инструкция как экспортировать открытый ключ
  16. Экспорт открытого ключа из КриптоПро CSP
  17. Что такое закрытый ключ ЭЦП
  18. Инструкция как экспортировать закрытый ключ
  19. Зачем копировать сертификаты ЭЦП
  20. Способы копирования ЭЦП
  21. Извлечение сертификата из контейнера
  22. Копирование закрытого ключа в реестр
  23. Копирование при помощи мастера экспорта ключей
  24. Массовое копирование
  25. Как привязать сертификат к контейнеру
  26. Ошибка при копировании контейнера
  27. Экспорт ключей и сертификатов
  28. Импорт ключей и сертификатов
  29. Как быть если доступ к старой системе невозможен?
  30. Файл primary. key
  31. Файл masks. key
  32. Файл header. key
  33. Читаем закрытый ключ и конвертируем
  34. Сборка утилиты конвертирования ключа
  35. Компиляция OpenSSL библиотеки
  36. Компиляция privkey.c
  37. Формирование файла закрытого ключа private.key
  38. Пользуемся закрытым ключом private.key для подписывания файла file.txt
  39. Проверяем подпись
  40. Перенос ключей КриптоПро 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. Установка сертификата из закрытого ключа

Теперь нам нужно получить сертификат, сделать это можно следующим образом:

  1. Открываем КриптоПро CSP
  2. Заходим на вкладку Сервис
  3. Нажимаем кнопку Просмотреть сертификаты в контейнере, нажимаем Обзор и здесь (если на предыдущих шагах сделали все правильно) у нас появится наш контейнер. Нажимаем кнопку Далее, появятся сведения о сертификате и тут нажимаем кнопку Установить (программа может задать вопрос проставить ли ссылку на закрытый ключ, ответьте «Да»)
  4. После этого сертификат будет установлен в хранилище и станет возможным подписание документов (при этом, в момент подписания документа, нужно будет чтобы флешка или токен были вставлены в компьютер)

5. Использование электронной подписи без токена или флешки (установка в реестр)

Если скорость и удобство работы для вас стоит чуть выше чем безопасность, то можно установить ваш закрытый ключ в реестр Windows. Для этого нужно сделать несколько простых действий:

  1. Выполните подготовку закрытого ключа, описанную в пунктах (2) или (3)
  2. Далее открываем КриптоПро CSP
  3. Заходим на вкладку Сервис
  4. Нажимаем кнопку Скопировать
  5. С помощью кнопки Обзор выбираем наш ключ
  6. Нажимаем кнопку Далее, потом придумаем какое-нибудь имя, например «Пупкин, ООО Ромашка» и нажимаем кнопку Готово
  7. Появится окно, в котором будет предложено выбрать носитель, выбираем Реестр, жмем Ок
  8. Система попросит Установить пароль для контейнера, придумываем пароль, жмем Ок

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

Transfer-keys-certificates-CryptoPro-004.png
Затем на целевой системе откройте редактор реестра, перейдите в раздел и через Файл – Загрузить куст подключите скопированный из старой системы раздел реестра. Дайте ему осмысленное имя, скажем OLD_SOFTWARE.
Transfer-keys-certificates-CryptoPro-005.png
После чего пройдите в раздел с закрытыми ключами (с учетом новой точки монтирования) и выполните экспорт ветки .
Transfer-keys-certificates-CryptoPro-006.png
Дальнейшие действия ничем не отличаются от описанных нами в разделе Импорт ключей и сертификатов.

Читайте также:  VDS VPS с Linux Ubuntu 🐧

Экспорт ключей и сертификатов

Для того, чтобы правильно экспортировать закрытые ключи, нам нужно выяснить идентификатор безопасности (SID) текущего пользователя (который работает с ЭЦП), это можно сделать командной:

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


Что такое открытый ключ ЭЦП

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

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

Сертификат содержит в себе следующие данные:

  • срок действия сертификата;

  • реквизиты удостоверяющего центра;

  • ФИО владельца сертификата;

  • название криптографического алгоритма;

Электронный сертификат виден на обычных носителях в виде файла с расширением .cer, а на защищённых картах Рутокен, eToken и JaCarta он скрыт. Чтобы увидеть скрытый сертификат, его необходимо экспортировать.

Инструкция как экспортировать открытый ключ

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

Экспорт открытого ключа через свойства обозревателя

Свойства браузера

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

Сертификаты

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

Экспорт

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

Мастер экспорта сертификатов

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

Формат экспортируемого файла

Готово

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

КриптоПро CSP

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

Просмотреть сертификаты в контейнере

Обзор

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

Свойства

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

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

Мастер экспорта сертификатов

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

Формат экспортируемого файла

Готово

Что такое закрытый ключ ЭЦП

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

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

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

Как и в случае с сертификатом, закрытый ключ может быть как скрыт так и виден, в зависимости от носителя. Он представлен в виде папки, которая содержит несколько файлов с расширением .key, поэтому закрытый ключ также называют контейнером. Скрытый контейнер с закрытым ключом нужно экспортировать, чтобы получить к нему прямой доступ.

Инструкция как экспортировать закрытый ключ

Выполнять экспорт закрытого ключа электронной подписи можно из криптопровайдера КриптоПро CSP.

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


  2. Сервис


    Скопировать контейнер


  3. Обзор

  4. Если вы копируете закрытый ключ с защищённого носителя, введите pin-код.

  5. Введите название копии закрытого ключа и нажмите «Готово».


  6. контейнер


    готово

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


  8. Выбор ключевого носителя

  9. Установите пароль на контейнер. Несмотря на то что этот шаг необязательный, установка пароля обеспечит дополнительную защиту.


  10. пароль на контейнер


Открытый и закрытый ключи квалифицированной электронной подписи выполняют разные функции, но для работы нужны обе части. В некоторых случаях владельцу ЭЦП нужно сделать экспорт на другой носитель, воспользоваться он может как средствами 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».

extern

Отчитайтесь легко и без ошибок. Удобный сервис для подготовки и сдачи отчётов через интернет. Дарим доступ на 14 дней в Экстерн!

1. Зайдите на профиль Диагностики «Копирования» по ссылке.

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

3. На нужном сертификате нажмите на кнопку «Скопировать».

Криптопро не копирует приватный ключ и Как экспортировать приватную и публичную часть ключа электронной подписи

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

Криптопро не копирует приватный ключ и Как экспортировать приватную и публичную часть ключа электронной подписи

Введите пароль и нажмите на кнопку «Далее».

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

Криптопро не копирует приватный ключ и Как экспортировать приватную и публичную часть ключа электронной подписи

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

Криптопро не копирует приватный ключ и Как экспортировать приватную и публичную часть ключа электронной подписи

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

Криптопро не копирует приватный ключ и Как экспортировать приватную и публичную часть ключа электронной подписи

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

Криптопро не копирует приватный ключ и Как экспортировать приватную и публичную часть ключа электронной подписи

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

Криптопро не копирует приватный ключ и Как экспортировать приватную и публичную часть ключа электронной подписи

4. После копирования нажмите внизу слева кнопку Обновить
Если хотите работать со скопированными контейнерами — необходимо установить сертификаты.

extern

Отчитайтесь легко и без ошибок. Удобный сервис для подготовки и сдачи отчётов через интернет. Дарим доступ на 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. Для корректной работы сертификата со встроенной лицензией переустановите сертификат в контейнер (см. Как установить личный сертификат в КриптоПро).

extern

Отчитайтесь легко и без ошибок. Удобный сервис для подготовки и сдачи отчётов через интернет. Дарим доступ на 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. После того, как данные будут внесены в реестр, необходимо вручную установить сертификат (см. Как установить личный сертификат). 

Transfer-keys-certificates-CryptoPro-000.pngКриптоПро один из наиболее широко используемых криптопровайдеров на территории Российской Федерации, он широко используется в системах электронного документооборота, сдачи отчетности и взаимодействия с государственными органами, поэтому встретить его можно практически в любой организации. По этой причине у системных администраторов часто встает вопрос его переноса на другой ПК. А так как криптография является для многих сложной и непонятной областью, то эта простая задача может вызвать некоторые затруднения.

Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном курсе по администрированию MikroTik. Автор курса, сертифицированный тренер MikroTik Дмитрий Скоромнов, лично проверяет лабораторные работы и контролирует прогресс каждого своего студента. В три раза больше информации, чем в вендорской программе MTCNA, более 20 часов практики и доступ навсегда.

В повседневной деятельности широко распространено понятие «сертификат», им оперируют все, от сотрудников удостоверяющих центров, то бухгалтеров, работающих с ЭЦП. Часто можно услышать что-то подобное: «нам купили в бухгалтерию новый компьютер, нужно перенести сертификаты». Но если подходить с точки зрения криптографии, то слово «сертификат» в данном случае употребляется неправильно. Вся современная криптография строится вокруг инфраструктуры открытых ключей (PKI), которая подразумевает наличие у каждого участника ключевой пары: открытого и закрытого ключа.

Закрытый ключ является секретным, с его помощью мы можем подписывать документы, шифровать информацию и т.д. и т.п. Закрытый ключ Усиленной квалифицированной электронной подписи (УКЭП) равнозначен нотариально заверенной подписи и его попадание в чужие руки может привести к самым тяжелым последствиям.

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

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

Выяснив этот момент, перейдем к хранилищам закрытых ключей. КриптоПро предполагает в таком качестве токены, флеш-накопители и системный реестр. Токены являются наиболее защищенными устройствами, извлечь закрытый ключ из них невозможно, и вы можете не опасаться несанкционированного копирования (для этого закрытый ключ должен быть помечен как неэкспортируемый). Флеш-накопители представляют некий компромисс между безопасностью и мобильностью, а реестр удобен в тех случаях, когда на одном ПК нужно одновременно работать с большим количеством ключей. И именно с ним связаны определенные сложности при переносе на другой узел.

Экспорт ключей и сертификатов

Для того, чтобы правильно экспортировать закрытые ключи, нам нужно выяснить идентификатор безопасности (SID) текущего пользователя (который работает с ЭЦП), это можно сделать командной:

Transfer-keys-certificates-CryptoPro-001.pngЗатем откроем редактор реестра и перейдем в ветку для 32-битных систем:

для 64-битных систем:

Найдем и раскроем раздел с SID текущего пользователя и экспортируем оттуда ветку Keys.

Transfer-keys-certificates-CryptoPro-002.pngОбратите внимание, что данная ветка содержит закрытые ключи, поэтому следует принять все меры безопасности и не передавать файл экспорта по открытым каналам связи и вообще исключить к нему несанкционированный доступ посторонних лиц.

После чего скопируем все сертификаты, расположенные по пути

Это открытые ключи, никакой секретности они не представляют, поэтому просто копируем их любым доступным способом.

Импорт ключей и сертификатов

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

Затем снова узнаем SID пользователя, который будет работать с ЭЦП, если это текущий пользователь, то снова выполните:

В противном случае:

где Name — имя пользователя.

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

Transfer-keys-certificates-CryptoPro-003.pngСохраните файл и импортируйте его в реестр. Закрытые ключи перенесены, файл переноса в целях безопасности следует удалить.

Следующим шагом скопируйте сохраненные сертификаты в

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

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

Теория — это хорошо, но практика может подкинуть самые неожиданные ситуации. Как быть, если доступ к старой системе невозможен? Скажем вышла из строя материнская плата или серьезно повреждена операционная система?

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

С копированием сертификатов проблемы возникнуть не должно, их хранилище простая папка на диске, а вот с хранилищем закрытых ключей в реестре немного сложнее. Но не будем забывать, что системный реестр тоже хранится в файлах на диске. Вам следует любым доступным образом скопировать файл SOFTWARE из C:\Windows\System32\config

Transfer-keys-certificates-CryptoPro-004.pngЗатем на целевой системе откройте редактор реестра, перейдите в раздел HKEY_LOCAL_MACHINE и через Файл — Загрузить куст подключите скопированный из старой системы раздел реестра. Дайте ему осмысленное имя, скажем OLD_SOFTWARE.

Transfer-keys-certificates-CryptoPro-005.pngПосле чего пройдите в раздел с закрытыми ключами (с учетом новой точки монтирования) и выполните экспорт ветки Keys.

Transfer-keys-certificates-CryptoPro-006.pngДальнейшие действия ничем не отличаются от описанных нами в разделе Импорт ключей и сертификатов.

Научиться настраивать 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:

primary.key

Файл masks. key

Содержит 32 байта маски ключа в формате Asn1, зашифрованного на ключе хранения pwd_key. Далее 12 байт «затравочной» информации для генерации ключа хранения pwd_key, если криптоконтейнер защищен паролем, то пароль также участвует в генерации ключа хранения.

Далее контрольная сумма (имитозащита) 4 байта. Контрольной информацией для простоты мы пользоваться не будем, общий контроль будет осуществляться путем генерации открытого ключа и сравнения первых 8 байт полученного ключа с соответствующим полем из файла header.key:

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

header.key

Читаем закрытый ключ и конвертируем

#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

Все работает просто замечательно!

Спасибо за внимание. Это была моя первая статья на хабре.

  1. Главная
  2. Инструкции по учету в программах 1С
  3. Документация для пользователей 1С
  4. 1С-Отчетность. Руководство пользователя 1С:Предприятие 8
  5. Работа с ключами и настройка криптографии
Оцените статью
Хостинги