ОТКРЫТЬ КРИПТО КЛЮЧ

Часто к нам обращаются с вопросом, как установить сертификат через КриптоПpo CSP
. Ситуации бывают разные: сменился директор или главбух, получили новый сертификат в удостоверяющем центре и т.п. Раньше все работало, а теперь нет. Рассказываем, что нужно делать, чтобы установить личный цифровой сертификат на компьютер.

Вы можете установить личный сертификат двумя способами:

1. Через меню КриптоПро CSP «Просмотреть сертификаты в контейнере»

2. Через меню КриптоПро CSP «Установить личный сертификат»

Если на рабочем месте используется операционная система Windows 7 без SP1, то устанавливать сертификат следует по рекомендациям варианта № 2.

Вариант № 1. Устанавливаем через меню «Просмотреть сертификаты в контейнере»

Чтобы установить сертификат:

1. Выберите Пуск -> Панель управления -> КриптоПро CSP -> вкладка Сервис и нажмите кнопку “Просмотреть сертификаты в контейнере”.

Image 1.jpg

2. В открывшемся окне нажмите на кнопку “Обзор”. Выберите контейнер и подтвердите свой выбор кнопкой ОК.

Image 2.jpg

3. В следующем окне нажмите “Далее”.

Если появится сообщение “В контейнере закрытого ключа отсутствует открытый ключ шифрования”, перейдите к установке цифрового сертификата по варианту № 2.

4. Если на вашем компьютере установлена версия “КриптоПро CSP” 3.6 R2 (версия продукта 3.6.6497) или выше, то в открывшемся окне нажмите на кнопку “Установить”. После этого согласитесь с предложением заменить сертификат.

Если кнопка “Установить” отсутствует, в окне “Сертификат для просмотра” нажмите кнопку “Свойства”.

Image 5.jpg

5. В окне “Сертификат” — > вкладка “Общие” нажмите на кнопку “Установить сертификат”.

Image 6.jpg

6. В окне “Мастер импорта сертификатов” выберите “Далее”.

7. Если у вас уставлена версия “КриптоПро CSP” 3.6, то в следующем окне достаточно оставить переключатель на пункте “Автоматически выбрать хранилище на основе типа сертификата” и нажать “Далее”. Сертификат будет автоматически установлен в хранилище “Личные”.

Image 7.jpg

8. В следующем окне нажмите “Далее”, затем “Готово” и дождитесь сообщения об успешной установке сертификата: “Импорт успешно выполнен”.

Image 8.jpg

Вариант 2. Устанавливаем через меню «Установить личный сертификат»

Для установки вам понадобится, собственно, сам файл сертификата (с расширением .cer). Он может находиться, например, на дискете, на токене или на жестком диске компьютера.

Чтобы установить сертификат:

1. Выберите Пуск -> Панель управления -> КриптоПро CSP -> вкладка Сервис и нажмите кнопку “Установить личный сертификат”.

Image 3.jpg

2. В окне “Мастер установки личного сертификата” нажмите на кнопку “Далее”. В следующем окне, чтобы выбрать файл сертификата, нажмите “Обзор”.

Image 4.jpg

3. Укажите путь к сертификату и нажмите на кнопку “Открыть”, затем “Далее”.

Image 10.jpg

4. В следующем окне вы можете просмотреть информацию о сертификате. Нажмите “Далее”.

Image 11.jpg

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

Image 12.jpg

6.  Выбрав контейнер, нажмите “Далее”.

Image 13.jpg

7. Дальше вам необходимо выбрать хранилище, куда будет установлен сертификат. Для этого в окне “Выбор хранилища сертификатов” нажмите на кнопку “Обзор”.

Если у вас установлена версия КриптоПро CSP 3.6 R2 (версия продукта 3.6.6497) или выше, поставьте флаг “Установить сертификат в контейнер”.

Image 14.jpg

8. Выберите хранилище “Личные” и нажмите ОК.

Image 15.jpg

9. Хранилище вы выбрали. Теперь нажмите “Далее”, затем — “Готово”. После этого может появиться сообщение:

Image 16.jpg

В этом случае нажмите “Да”.

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

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

Время на прочтение

ОТКРЫТЬ КРИПТО КЛЮЧ

FYI.
Статья написана в далеком 2019 году, делайте поправку на изменения.

Благодаря сертификату КЭП на USB-токене можно удаленно заключить договор с контрагентом или дистанционным сотрудником, направить документы в суд; зарегистрировать онлайн-кассу, урегулировать задолженность по налогам и подать декларацию в личном кабинете на nalog.ru; узнать о задолженностях и предстоящих проверках на Госуслугах.

Представленный ниже мануал поможет работать с КЭП под macOS
– без изучения форумов КриптоПро и установки виртуальной машины с Windows.

Что нужно для работы с КЭП под macOS:

Устанавливаем и настраиваем КЭП под macOS

  1. Устанавливаем КриптоПро CSP
  2. Устанавливаем драйверы Рутокен
  3. Устанавливаем сертификаты

    3.1. Удаляем все старые ГОСТовские сертификаты

    3.2. Устанавливаем корневые сертификаты

    3.3. Скачиваем сертификаты удостоверяющего центра

    3.4. Устанавливаем сертификат с Рутокен

  4. Устанавливаем специальный браузер Chromium-GOST
  5. Устанавливаем расширения для браузера

    5.1 КриптоПро ЭЦП Browser plug-in

    5.2. Плагин для Госуслуг

    5.3. Настраиваем плагин для Госуслуг

    5.4. Активируем расширения

    5.5. Настраиваем расширение КриптоПро ЭЦП Browser plug-in

  6. Проверяем что все работает

    6.1. Заходим на тестовую страницу КриптоПро

    6.2. Заходим в Личный Кабинет на nalog.ru

    6.3. Заходим на Госуслуги

  7. Что делать если перестало работать

Смена PIN-кода контейнера

  1. Выясняем название контейнера КЭП
  2. Смена PIN командой из terminal

Подпись файлов в macOS

  1. Выясняем хэш сертификата КЭП
  2. Подпись файла командой из terminal
  3. Установка Apple Automator Script

Проверить подпись на документе

Вся информация ниже получена из авторитетных источников (КриптоПро #1
, #2
и #3
, Рутокен
, Корус-Консалтинг
, УФО Минкомсвязи
), а скачивать ПО предлагается с доверенных сайтов. Автор является независимым консультантом и не связан ни с одной из упомянутых компаний. Следуя данной инструкции, всю ответственность за любые действия и последствия вы принимаете на себя.

Содержание
  1. Что нужно для работы с КЭП под macOS
  2. Устанавливаем и настраиваем КЭП под macOS
  3. 1. Устанавливаем КриптоПро CSP
  4. 2. Устанавливаем драйверы Рутокен
  5. 3. Устанавливаем сертификаты
  6. 3.1. Удаляем все старые ГОСТовские сертификаты
  7. 3.2. Устанавливаем корневые сертификаты
  8. 3.3. Скачиваем сертификаты удостоверяющего центра
  9. 3.4. Устанавливаем сертификат с Рутокен
  10. 3.5. Конфигурируем CryptoPro для работы ссертификатами ГОСТ Р 34.10-2012
  11. 4. Устанавливаем специальный браузер Chromium-GOST
  12. 5. Устанавливаем расширения для браузера
  13. 5.1 КриптоПро ЭЦП Browser plug-in
  14. 5.2. Плагин для Госуслуг
  15. 5.3. Настраиваем плагин для Госуслуг
  16. 5.4. Активируем расширения
  17. 5.5. Настраиваем расширение КриптоПро ЭЦП Browser plug-in
  18. 6. Проверяем что все работает
  19. 6.1. Заходим на тестовую страницу КриптоПро
  20. 6.2. Заходим в Личный Кабинет на nalog.ru
  21. 6.3. Заходим на Госуслуги
  22. 7. Что делать, если перестало работать
  23. Смена PIN-кода контейнера
  24. 1. Выясняем название контейнера КЭП
  25. 2. Смена PIN командой из terminal
  26. Подпись файлов в macOS
  27. 1. Выясняем хэш сертификата КЭП
  28. 2. Подпись файла командой из terminal
  29. 3. Установка Apple Automator Script
  30. Проверить подпись на документе
  31. Где хранится лицензия КриптоПро
  32. Что такое редактор реестра
  33. Как зайти в реестр
  34. Как открыть редактор реестра через утилиту «Выполнить»
  35. Как открыть редактор реестра через меню «Пуск»
  36. Экспорт файла открытого ключа
  37. Экспорт из хранилища Личные
  38. Экспорт с помощью КриптоПро CSP
  39. Нажмите на кнопку «Обзор», укажите имя и каталог для сохранения файла и нажмите «Сохранить». 
  40. Далее
  41. Файл primary. key
  42. Файл masks. key
  43. Файл header. key
  44. Читаем закрытый ключ и конвертируем
  45. Сборка утилиты конвертирования ключа
  46. Компиляция OpenSSL библиотеки
  47. Компиляция privkey.c
  48. Формирование файла закрытого ключа private.key
  49. Пользуемся закрытым ключом private.key для подписывания файла file.txt
  50. Проверяем подпись
  51. Где получить квалифицированную электронную подпись
  52. Можно ли скопировать подпись от ФНС на компьютер
  53. Как работать с ЭЦП без флешки
  54. Регистрация и установка программного решения КриптоПро
  55. Установка драйвера Рутокен
  56. Установка сертификата ЭЦП с Рутокен
  57. Панель управления Рутокен
  58. Кнопка «Просмотреть сертификаты в контейнере»
  59. Кнопка «Установить личный сертификат»
  60. Заключение

Что нужно для работы с КЭП под macOS

  1. КЭП на USB-токене Рутокен Lite
    или Рутокен ЭЦП
  2. криптоконтейнер в формате КриптоПро
  3. со встроенной лицензией на КриптоПро CSP
  4. открытый сертификат должен храниться в контейнере закрытого ключа

Поддержка 
eToken и JaCarta в связке с КриптоПро под macOS под вопросом. Носитель Рутокен Lite – оптимальный выбор, стоит недорого, шустро работает и позволяет хранить до 15 ключей.

Криптопровайдеры VipNet, Signal-COM и ЛИССИ в macOS не поддерживаются. Преобразовать контейнеры никак не получится. КриптоПро – оптимальный выбор, стоимость сертификата в себестоимости от 500= руб. Можно выпустить сертификат с встроенной лицензией на КриптоПро CSP, это удобно и выгодно. 
 Если лицензия не зашита, то необходимо купить и активировать полноценную лицензию на КриптоПро CSP.

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

Устанавливаем и настраиваем КЭП под macOS

  • все загружаемые файлы скачиваются в каталог по-умолчанию: ~/Downloads/;
  • во всех установщиках ничего не меняем, все оставляем по-умолчанию;
  • если macOS выводит предупреждение, что запускаемое ПО от неустановленного разработчика – нужно подтвердить запуск в системных настройках: System Preferences —> Security & Privacy —> Open Anyway
    ;
  • если macOS запрашивает пароль пользователя и разрешение на управление компьютером – нужно ввести пароль и со всем согласиться.

1. Устанавливаем КриптоПро CSP

2. Устанавливаем драйверы Рутокен

Далее подключаем usb-токен, запускаем terminal и выполняем команду:

   /opt/cprocsp/bin/csptest -card -enum  
  

В ответе должно быть:

Aktiv Rutoken…

Card present…

[ErrorCode: 0x00000000]

3. Устанавливаем сертификаты

3.1. Удаляем все старые ГОСТовские сертификаты

Если ранее были попытки запустить КЭП под macOS, то необходимо почистить все ранее установленные сертификаты. Данные команды в terminal удалят только сертификаты КриптоПро и не затронут обычные сертификаты из Keychain в macOS.

   sudo /opt/cprocsp/bin/certmgr -delete -all -store mroot  
  

   sudo /opt/cprocsp/bin/certmgr -delete -all -store uroot  
  

   /opt/cprocsp/bin/certmgr -delete -all  
  

В ответе каждой команды должно быть:

No certificate matching the criteria

Deleting complete

3.2. Устанавливаем корневые сертификаты

Корневые сертификаты являются общими для всех КЭП, выданных любым удостоверяющим центром. Скачиваем со страницы загрузок
УФО Минкомсвязи:

Устанавливаем командами в terminal:

   sudo /opt/cprocsp/bin/certmgr -inst -store mroot -f ~/Downloads/4BC6DC14D97010C41A26E058AD851F81C842415A.cer  
  

   sudo /opt/cprocsp/bin/certmgr -inst -store mroot -f ~/Downloads/8CAE88BBFD404A7A53630864F9033606E1DC45E2.cer  
  

   sudo /opt/cprocsp/bin/certmgr -inst -store mroot -f ~/Downloads/0408435EB90E5C8796A160E69E4BFAC453435D1D.cer  
  

Каждая команда должна возвращать:

Installing:

[ErrorCode: 0x00000000]

3.3. Скачиваем сертификаты удостоверяющего центра

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

ОТКРЫТЬ КРИПТО КЛЮЧ

ОТКРЫТЬ КРИПТО КЛЮЧ

Скачанные сертификаты УЦ устанавливаем командами из terminal:

   sudo /opt/cprocsp/bin/certmgr -inst -store mroot -f ~/Downloads/B9F1D3F78971D48C34AA73786CDCD138477FEE3F.cer  
  

   sudo /opt/cprocsp/bin/certmgr -inst -store mroot -f ~/Downloads/A0D19D700E2A5F1CAFCE82D3EFE49A0D882559DF.cer  
  

   sudo /opt/cprocsp/bin/certmgr -inst -store mroot -f ~/Downloads/55EC48193B6716D38E80BD9D1D2D827BC8A07DE3.cer  
  

   sudo /opt/cprocsp/bin/certmgr -inst -store mroot -f ~/Downloads/15EB064ABCB96C5AFCE22B9FEA52A1964637D101.cer  
  

где после ~/Downloads/
идут имена скачанных файлов, для каждого УЦ они будут свои.

Каждая команда должна возвращать:

Installing:

[ErrorCode: 0x00000000]

3.4. Устанавливаем сертификат с Рутокен

Команда в terminal:

   /opt/cprocsp/bin/csptestf -absorb -certs  
  

Команда должна вернуть:

OK.

[ErrorCode: 0x00000000]

3.5. Конфигурируем CryptoPro для работы ссертификатами ГОСТ Р 34.10-2012

Для корректной работы на nalog.ru с сертификатами, выдаваемыми с 2019 года, инструкция
на сайте CryptoPro рекомендует:

Команды в terminal:

   sudo /opt/cprocsp/sbin/cpconfig -ini '\cryptography\OID\1.2.643.7.1.1.1.1!3' -add string 'Name' 'GOST R 34.10-2012 256 bit'  
  

   sudo /opt/cprocsp/sbin/cpconfig -ini '\cryptography\OID\1.2.643.7.1.1.1.2!3' -add string 'Name' 'GOST R 34.10-2012 512 bit'  
  

Команды ничего не возвращают.

4. Устанавливаем специальный браузер Chromium-GOST


Скачиваем, устанавливаем копированием или drag&drop в каталог Applications. После установки принудительно закрываем Chromium-Gost командой из terminal и пока не открываем (работаем из Safari):

   killall Chromium-Gost  
  

5. Устанавливаем расширения для браузера

5.1 КриптоПро ЭЦП Browser plug-in

5.2. Плагин для Госуслуг

5.3. Настраиваем плагин для Госуслуг

Выполняем команды в terminal:

   sudo rm /Library/Internet\ Plug-Ins/IFCPlugin.plugin/Contents/ifc.cfg  
  

   sudo cp ~/Downloads/ifc.cfg /Library/Internet\ Plug-Ins/IFCPlugin.plugin/Contents
  
  

   sudo cp /Library/Google/Chrome/NativeMessagingHosts/ru.rtlabs.ifcplugin.json /Library/Application\ Support/Chromium/NativeMessagingHosts  
  

5.4. Активируем расширения

Запускаем браузер Chromium-Gost и в адресной строке набираем:

   chrome://extensions/  
  

Включаем оба установленных расширения:

  • CryptoPro Extension for CAdES Browser Plug-in
  • Расширение для плагина Госуслуг

ОТКРЫТЬ КРИПТО КЛЮЧ

5.5. Настраиваем расширение КриптоПро ЭЦП Browser plug-in

В адресной строке Chromium-Gost набираем:

   /etc/opt/cprocsp/trusted_sites.html  
  

На появившейся странице в список доверенных узлов по-очереди добавляем сайты:

   https://*.cryptopro.ru
https://*.nalog.ru
https://*.gosuslugi.ru  
  

Жмем “Сохранить”. Должна появиться зеленая плашка:

Список доверенных узлов успешно сохранен.

ОТКРЫТЬ КРИПТО КЛЮЧ

6. Проверяем что все работает

6.1. Заходим на тестовую страницу КриптоПро

В адресной строке Chromium-Gost набираем:

   https://www.cryptopro.ru/sites/default/files/products/cades/demopage/cades_bes_sample.html  
  

Должно выводиться “Плагин загружен”, а в списке ниже присутствовать ваш сертификат.

Выбираем сертификат из списка и жмем “Подписать”. Будет запрошен PIN-код сертификата. В итоге должно отобразиться

Подпись сформирована успешно

ОТКРЫТЬ КРИПТО КЛЮЧ

6.2. Заходим в Личный Кабинет на nalog.ru

По ссылкам с сайта nalog.ru зайти может не получиться, т.к. не будут пройдены проверки. Заходить нужно по прямым ссылкам:

  • Личный кабинет ИП
    : https://lkipgost.nalog.ru/lk
  • Личный кабинет ЮЛ
    : https://lkul.nalog.ru

ОТКРЫТЬ КРИПТО КЛЮЧ

6.3. Заходим на Госуслуги

При авторизации выбираем «Вход с помощью электронной подписи». В появившемся списке «Выбор сертификата ключа проверки электронной подписи» будут отображены все сертификаты, включая корневые и УЦ, нужно выбрать ваш с usb-токена и ввести PIN.

ОТКРЫТЬ КРИПТО КЛЮЧ

ОТКРЫТЬ КРИПТО КЛЮЧ

7. Что делать, если перестало работать

  1. Переподключаем usb-токен и проверяем что он виден с помощью команды в terminal:

       sudo /opt/cprocsp/bin/csptest -card -enum  
      

  2. Очищаем кеш браузера за все время, для чего в адресной строке Chromium-Gost набираем:

       
chrome://settings/clearBrowserData
  
      

  3. Переустанавливаем сертификат КЭП с помощью команды в terminal:

       /opt/cprocsp/bin/csptestf -absorb -certs  
      

  4. Если команды Cryptopro не отрабатывают (csptest и csptestf превратились в corrupted) – нужно переустановить Cryptopro.

Смена PIN-кода контейнера

Пользовательский PIN-код на Рутокен по-умолчанию 12345678
, и оставлять его в таком виде никак нельзя. Требования к PIN-коду Рутокен: 16 символов max., может содержать латинские буквы и цифры.

1. Выясняем название контейнера КЭП

На usb-токене и в других хранилищах может храниться несколько сертификатов, и нужно выбрать правильный. При вставленном usb-токене получаем список всех контейнеров в системе командой в terminal:

   /opt/cprocsp/bin/csptest -keyset -enum_cont -fqcn -verifycontext  
  

Команда должна вывести минимум 1 контейнер и вернуть

[ErrorCode: 0x00000000]

Нужный нам контейнер имеет вид

\.\Aktiv Rutoken lite\XXXXXXXX

Если таких контейнеров выводится несколько – значит значит на токене записано несколько сертификатов, и вы в курсе какой именно вам нужен. Значение XXXXXXXX
после слэша нужно скопировать и подставить в команду ниже.

2. Смена PIN командой из terminal

   /opt/cprocsp/bin/csptest -passwd -qchange -container "XXXXXXXX"  
  

где XXXXXXXX
– название контейнера, полученное на шаге 1 (обязательно в кавычках).

Появится диалог КриптоПро с запросом старого PIN-кода для доступа к сертификату, затем еще один диалог для ввода нового PIN-кода. Готово.

ОТКРЫТЬ КРИПТО КЛЮЧ

Подпись файлов в macOS

В macOS файлы можно подписывать в ПО КриптоАрм
(стоимость лицензии 2500= руб.), или несложной командой через terminal – бесплатно.

1. Выясняем хэш сертификата КЭП

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

Токен должен быть вставлен. Получаем список сертификатов в хранилищах командой из terminal:

   /opt/cprocsp/bin/certmgr -list  
  

Команда должна вывести минимум 1 сертификат вида:

Certmgr 1.1 © «Crypto-Pro», 2007-2018.

program for managing certificates, CRLs and stores

= = = = = = = = = = = = = = = = = = = =

1——-

Issuer: E=help@esphere.ru,… CN=ООО КОРУС Консалтинг СНГ…

Subject: E=sergzah@gmail.com,… CN=Захаров Сергей Анатольевич…

Serial: 0x0000000000000000000000000000000000

SHA1 Hash: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

.

Container: SCARD\rutoken_lt_00000000\0000\0000

= = = = = = = = = = = = = = = = = = = =

[ErrorCode: 0x00000000]

2. Подпись файла командой из terminal

В terminal переходим в каталог с файлом для подписания и выполняем команду:

   /opt/cprocsp/bin/cryptcp -signf -detach -cert -der -strict -thumbprint ХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХ FILE  
  

Команда должна вернуть:

Signed message is created.

[ErrorCode: 0x00000000]

Будет создан файл электронной подписи с расширением *.sgn – это отсоединенная подпись в формате CMS с кодировкой DER.

3. Установка Apple Automator Script

  1. Распаковываем архив ‘Sign with CryptoPro.zip’
  2. Запускаем Automator
  3. Находим и открываем распакованный файл ‘Sign with CryptoPro.workflow’
  4. В блоке Run Shell Script
    меняем текст ХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХ
    на значение параметра SHA1 Hash
    сертификата КЭП, полученное выше.
  5. Сохраняем скрипт: ⌘Command + S
  6. Запускаем файл ‘Sign with CryptoPro.workflow’
    и подтверждаем установку.
  7. Идем в System Preferences —> Extensions —> Finder
    и проверяем, что Sign with CryptoPro
    quick action отмечено.
  8. В Finder вызываем контекстное меню любого файла, и в разделе Quick Actions
    и/или Services
    выбрать пункт Sign with CryptoPro
  9. В появившемся диалоге КриптоПро ввести PIN-код пользователя от КЭП
  10. В текущем каталоге появится файл с расширением *.sgn – отсоединенная подпись в формате CMS с кодировкой DER.

Окно Apple Automator:

ОТКРЫТЬ КРИПТО КЛЮЧ

Контекстное меню Finder:

ОТКРЫТЬ КРИПТО КЛЮЧ

Проверить подпись на документе

Если содержимое документа не содержит секретов и тайн, то проще всего воспользоваться web-сервисом на портале Госуслуг – https://www.gosuslugi.ru/pgu/eds
. Так можно сделать скриншот с авторитетного ресурса и быть уверенным что с подписью все ок.

ОТКРЫТЬ КРИПТО КЛЮЧ

ОТКРЫТЬ КРИПТО КЛЮЧ

вопросы

Из нашей статьи вы узнаете:

КриптоПро CSP — это средство криптографической защиты информации (СКЗИ). Оно создаёт электронную подпись, шифрует и защищает передаваемые данные. У программы есть пробный период, после которого необходимо купить лицензию.

Купить
подходящую лицензию КриптоПро рекомендуем в нашем интернет-магазине. Оставьте короткую заявку для бесплатной консультации специалиста.

Лицензия выдаётся на специальном бланке. Её вводят при первичной или повторной установке программы. Случается, что операционную систему (ОС) компьютера требуется переустановить, а бланк с номером лицензии утерян. В этом случае пользователь может посмотреть номер ключа лицензии на ПК.

Ниже рассмотрим, где хранится ключ КриптоПро и как его посмотреть.

Где хранится лицензия КриптоПро

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

Что такое редактор реестра

Реестр Windows — это база данных, которая хранит параметры и настройки операционной системы. Он содержит в себе абсолютно все сведения, касающиеся установленного оборудования и программ: информацию об ОС, о профилях пользователей, типах создаваемых документов, свойствах папок и значках, оборудовании и портах. В том числе в реестре содержится номер лицензии установленного СКЗИ КриптоПро CSP.

Как зайти в реестр

Зайти в реестр, где хранятся ключи КриптоПро, просто так не получится. Это делается только через специальную программу — редактор реестра. Это встроенный компонент ОС Windows. Запустить его можно двумя способами, используя команду Regedit: через утилиту «Выполнить» или меню «Пуск».

Как открыть редактор реестра через утилиту «Выполнить»

Чтобы запустить редактор реестра потребуется:

  1. Сочетанием клавиш Win+R открыть консоль «Выполнить».
  2. В строке «Открыть:» ввести команду: regedit.
  3. Нажать «ОК».
  4. открыть консоль «Выполнить»

Как открыть редактор реестра через меню «Пуск»

Чтобы открыть редактор реестра другим способом, пользователю необходимо:

  1. Открыть меню «Пуск».
  2. В строке поиска ввести: regedit.
  3. Запустить редактор реестра.

    Где искать ключ от КриптоПро в реестре

  1. После того как редактор реестра запущен, пользователю необходимо перейти в ветку реестра, которая соответствует установленной версии КриптоПро CSP:

  • для КриптоПро CSP 3.6:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\05480A45343B0B0429E4860F13549069\InstallProperties;
  • для КриптоПро CSP 3.9: Открыть меню «Пуск»

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\68A52D936E5ACF24C9F8FE4A1C830BC8\InstallProperties;

    для КриптоПро CSP 4.0:

      HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\7AB5E7046046FB044ACD63458B5F481C\InstallProperties;
    • для КриптоПро CSP 5.0:

      HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\08F19F05793DC7340B8C2621D83E5BE5\InstallProperties.

  • Нажать строку «ProductID»;
  • В поле «Значение» будет указан серийный номер требуемой лицензии КриптоПро CSP.
  • После этого пользователь записывает ключ, переустанавливает ОС и устанавливает КриптоПро с использованием своего ключа лицензии.

    Экспорт файла открытого ключа

    Экспортировать файла открытого ключа можно одним из способов:

    Экспорт из хранилища Личные

    Для экспорта файла открытого ключа из хранилища Личные выполните следующее:

    1. Выберите меню «Пуск» («Настройки») → «Служебные Windows» → «Панель управления» → «Сеть и интернет» → «Свойства обозревателя» («Свойства браузера») или укажите в строке поиска на панели Windows «Свойства браузера» и нажмите на них. 
    2. Выберите вкладку «Содержание» и нажмите на кнопку «Сертификаты».

      ОТКРЫТЬ КРИПТО КЛЮЧ

    3. Найдите в списке нужный сертификат и нажмите на кнопку «Экспорт».

      ОТКРЫТЬ КРИПТО КЛЮЧ

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

      ОТКРЫТЬ КРИПТО КЛЮЧ

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

      ОТКРЫТЬ КРИПТО КЛЮЧ

    8. Нажмите на кнопку «Обзор», укажите имя и каталог для сохранения файла и нажмите «Сохранить».

      ОТКРЫТЬ КРИПТО КЛЮЧ

    9. Нажмите «Далее».
    10. Нажмите «Готово». Дождитесь сообщения об успешном экспорте.


    Экспорт с помощью КриптоПро CSP

    1. Выберите меню «Пуск» → «Панель управления» → «КриптоПро CSP» или укажите в строке поиска на панели Windows «КриптоПро CSP» и нажмите на него. 
    2. Выберите вкладку «Сервис» и нажмите «Просмотреть сертификаты в контейнере».

      ОТКРЫТЬ КРИПТО КЛЮЧ

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

      ОТКРЫТЬ КРИПТО КЛЮЧ

    5. Нажмите «Далее». 
    6. Нажмите на кнопку «Свойства».

      ОТКРЫТЬ КРИПТО КЛЮЧ

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

      ОТКРЫТЬ КРИПТО КЛЮЧ

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

      ОТКРЫТЬ КРИПТО КЛЮЧ

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

      Нажмите на кнопку «Обзор», укажите имя и каталог для сохранения файла и нажмите «Сохранить». 

      1. Нажмите «Далее»

      2. Нажмите  «Готово». Дождитесь сообщения об успешном экспорте. ​

      Согласно википедии   сертификат открытого ключа
      он же файл открытого ключа, электронная цифровая подпись, сертификат ключа подписи, сертификат ключа проверки электронной подписи (согласно ст. 2 Федерального Закона от 06.04.2011 «Об электронной подписи» № 63-ФЗ) —  цифровой или бумажный документ, подтверждающий соответствие между открытым ключом и информацией, идентифицирующей владельца ключа. Содержит информацию о владельце ключа, сведения об открытом ключе, его назначении и области применения, название центра сертификации.

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

      Для того чтобы обмениваться зашифрованными сообщениями, сначала нужно обменяться сертификатами открытого ключа. Сообщение шифруется с помощью открытого ключа получателя и расшифровывается его закрытым ключом.

      Экспорт файла открытого ключа можно осуществить следующими способами:

      1.
      Экспорт из хранилища Личные: 

      • Для этого выбрать в настройках браузера (например Internet Explorer) 

      Настройки  / Свойства обозревателя
      / Содержание
      и нажать на кнопку Сертификаты.

      • Найти нужный сертификат и нажать Экспорт
        .

      1.jpg

      • В окне Мастер экспорта сертификатов
        нажать на кнопку Далее
        .

        Затем отметить пункт Нет, не экспортировать закрытый ключ
        и выбрать Далее.

      • В окне Формат экспортируемого файла
        выбрать Файлы X.509 (. CER) в кодировке DER
        и нажать на кнопку Далее.
      • В следующем окне необходимо кликнуть Обзор
        , указать имя и каталог для сохранения файла.

        Затем нажать на кнопку Сохранить.

      • В следующем окне нажать на кнопку Далее
        , затем Готово
        . Дождаться сообщения об успешном экспорте.

      2. Экспорт файла открытого ключа с помощью КриптоПро CSP: 

      • Выбрать меню Пуск / Панель управления / КриптоПро CSP
        .

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

      • В открывшемся окне нажать на кнопку Обзор
        , чтобы выбрать контейнер для просмотра.

        После выбора контейнера нажать на кнопку ОK.

      Image 6.jpg

      • В следующем окне кликнуть по кнопке Далее.
      • В окне Сертификат для просмотра
        необходимо нажать кнопку Свойства 

      • в открывшемся файле сертификата следует перейти на вкладку

        Состав

      • и нажать кнопку Копировать в файл.


    12. Далее следуем инструкции
      Мастера экспорта сертификатов
        нажимая

      Далее

      Нет, не экспортировать закрытый ключ

    13. Далее
      выбираем
       

    14. Файлы X.509 (. CER) в кодировке DER

      и снова 

      Далее. открыть консоль «Выполнить»

      В следующем окне необходимо кликнуть по кнопке

      Обзор

      , указать имя и каталог для сохранения файла.

        Затем нажать на кнопку

      Сохранить

    15. Открыть меню «Пуск» В следующем окне нажать на кнопку

      Далее

      , затем

      Готово

      .

         

    16. Дождаться сообщения об успешном экспорте. Закрыть все окна программы Крипто Про.


      Если экспортировать сертификат не удалось

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

      Image 10.png

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

       Для того чтобы зашифровать документ вам потребуется КриптоПРО CSP
      КриптоAPM
      . Дополнительных настроек, кроме размещения файла сертификата открытого ключа в хранилище Сертификаты других пользователей, как правило не требуется.

      Если инструкция показалась вам полезной -делитесь ей, кнопки для этого вы найдете прямо под статьей. 

      Время на прочтение

      Речь пойдет о файлах 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
        
        

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

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

      вопросы

      Из нашей статьи вы узнаете:

      Ключ электронной подписи (ЭП или ЭЦП) записывают на физический носитель — токен. Он взаимодействует с персональным компьютером при подписании цифровых документов. Активация носителя происходит через USB-разъём. Одним из популярных российских производителей физических носителей для электронной подписи является компания Рутокен. Ниже приведём подробную инструкцию о том, как установить ЭЦП с Рутокена на компьютер.

      Выбрать подходящий носитель для КЭП рекомендуем в нашем интернет-магазине.
      В каталоге представлены только сертифицированные модели токенов.

      Где получить квалифицированную электронную подпись

      Квалифицированная электронная подпись равнозначна рукописной и придаёт электронным документам юридическую значимость. С помощью неё сдают отчётность в государственные органы и ведут электронный документооборот с партнёрами и работниками. Получить квалифицированный сертификат электронной подписи можно только в специализированных удостоверяющих центрах. Для должностных лиц им является Казначейство РФ, участников финансового рынка — Центробанк, а руководителей юрлица и ИП — УЦ ФНС и её доверенные лица. Электронная подпись в этих ведомствах предоставляется бесплатно, а клиенты обслуживаются в порядке очереди.

      Для ускоренного выпуска квалифицированной ЭП для руководителя юрлица и ИП рекомендуем воспользоваться услугой Получение КЭП в ФНС под ключ.
      Специалисты УЦ «Калуга Астрал» помогут сэкономить время на получение электронной подписи и настройку рабочего места, а пройти идентификацию и получить подпись вы сможете через филиалы нашего партнёра — доверенного лица УЦ «Основание».

      Можно ли скопировать подпись от ФНС на компьютер

      Электронную подпись, полученную в налоговой, скопировать с Рутокена или любого другого носителя нельзя. У Ц ФНС изготавливает сертификаты ЭП в контейнере с неэкспортируемыми закрытыми ключами.

      При попытке копирования ключа пользователь получает ошибку или уведомление о том, что данный ключ неэкспортируемый:

      <img src="https://astral.ru/upload/iblock/b69/k2y9eybn2vl2tnu4ldu52mp1397lm6wp/1%20

      .png" alt="
      ключ неэкспортируемый1">

      <img src="https://astral.ru/upload/iblock/3a1/5dh9q819i5e8evzcms6lpurrz773z1py/2%20

      .png" alt="
      ключ неэкспортируемый2">

      Чтобы доверенное лицо или работник организации могли сдавать отчётность и подписывать документы от имени компании, потребуется личная ЭП и доверенность
      .

      Для решения повседневных задач и дистанционной работы с юридически значимыми документами рекомендуем квалифицированные ЭП от УЦ «Калуга Астрал». В каталоге
      представлены тарифы для физлиц и сотрудников организаций.

      Как работать с ЭЦП без флешки

      Чтобы работать с электронной подписью без носителя, требуется установить поочерёдно три компонента:

      1. КриптоПро;
      2. Драйвер Рутокен;
      3. Сертификат Рутокен.

      Регистрация и установка программного решения КриптоПро

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

      • средство криптографической защиты информации (СКЗИ) — для создания электронной подписи и шифрования информации;
      • соответствующий плагин — для работы ЭП в интернете.

      Отечественный разработчик КриптоПро является одной из ведущих компаний по производству продуктов для работы с электронной подписью. Он выпускает такие программы как КриптоПро CSP и КриптоПро ЭЦП Browser plug-in.

      Пробную версию дистрибутивов КриптоПро скачивают
      на сайте разработчика. Перед этим проходят регистрацию. По истечении трёх месяцев понадобится купить лицензию.

      Купить
      подходящую лицензию продукта КриптоПро рекомендуем в нашем интернет-магазине. Оставьте короткую заявку, для бесплатной консультации специалиста

      Установить КриптоПро на компьютер легко. После скачивания требуется запустить дистрибутив и следовать подсказкам мастера установки.

      С подробными инструкциями по настройке программ рекомендуем ознакомиться в наших статьях:

      Установка драйвера Рутокен

      Установить драйвер потребуется в несколько шагов.

      1. Закрыть все программы перед установкой.
      2. Скачать
        драйверы с официального портала компании Рутокен.
      3. Запустить файл rtDrivers и перезагрузить компьютер.

      Следующим этапом необходимо настроить считыватель Рутокена в приложении КриптоПро от имени администратора.

      1. Вставить носитель в ПК.
      2. Открыть «Пуск» → «Программы» → «КриптоПро CSP».
      3. Нажать правой кнопкой мыши и запустить программу от имени Администратора.
      4. Перейти во вкладку «Оборудование».
      5. Нажать «Настроить считыватели».
      6. <img src="https://astral.ru/upload/iblock/8a2/q594phs9fslj5srw9occz3wkzvqikw6v/3%20

        .png" alt="
        «Настроить считыватели»3">

      7. Откроется окно с доступными считывателями. Если пункт «Все считыватели смарт-карт» отсутствует, нужно нажать «Добавить». При неактивной кнопке перейти во вкладку «Общие» и выбрать «Запустить с правами администратора».
      8. <img src="https://astral.ru/upload/iblock/6ea/j8a3l99bpylb9si5nb2mip5psg62ikyq/4%20

        .png" alt="
        «Все считыватели смарт-карт»4">

      9. Нажать «Далее», выбрать → «Все считыватели смарт-карт» → «Далее».
      10. <img src="https://astral.ru/upload/iblock/a45/xc447uc0gtmmwbstdjganecv05zdrfe8/5%20

        .png" alt="
        «Далее»5">

      11. Нажать «Далее».
      12. <img src="https://astral.ru/upload/iblock/014/m2ce9ts1156w5zxzyf9x2y7lw8hju2fu/7%20

        .png" alt="
        «Далее»6">

      13. После нажать «Готово» → «Ок» → «Ок».

      Установка сертификата ЭЦП с Рутокен

      Установить ЭЦП с Рутокен можно тремя способами: с помощью «Панели управления Рутокен», через кнопки «Просмотреть сертификаты в контейнере» или «Установить личный сертификат».

      Панель управления Рутокен

      Инструкция по установке сертификата через панель управления Рутокен.

      • Открыть «Панель управления Рутокен», затем вкладку «Сертификаты».
      • Установить отметку «Зарегистрирован» напротив необходимого сертификата. При снятии отметки сертификат удалится из хранилища «Личное» на данном ПК.
      • <img src="https://astral.ru/upload/iblock/7b4/n3vrk7vae67ntlvn3gjjerxezybc7maz/8%20

      .png" alt="
      «Зарегистрирован»7">

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

      Для установки сертификата ЭЦП на компьютер из Рутокен через сертификаты потребуется:

      1. Выбрать «Пуск» → «Панель управления» → «КриптоПро CSP» → вкладка «Сервис» → «Просмотреть сертификаты в контейнере.».
      2. В открывшемся окне нажать «Обзор», выбрать контейнер и нажать «ОК».
      3. <img src="https://astral.ru/upload/iblock/890/fkhpc3p9c06binitkmmact533l3a0twf/9%20

        .PNG" alt="
        «Обзор»8">

        <img src="https://astral.ru/upload/iblock/332/47y35tgb8popdqvvrx6b5mckos3qv3ab/10%20

        .PNG" alt="
        «Обзор»9">

        <img src="https://astral.ru/upload/iblock/5c4/qyfyqw2iiro9kxzlgrpcvkcsy2b91stg/11%20

        .PNG" alt="
        «ОК»10">

      4. В открывшемся окне нажать «Далее».
      5. Затем «Установить» и подтвердить действие.
      6. <img src="https://astral.ru/upload/iblock/61e/tcfw73yq87xg7ixcbjszxwdlj0h6887w/12%20

        .PNG" alt="
        «Далее»12">

        <img src="https://astral.ru/upload/iblock/e6d/i6cuqbo4mnznbm1lvabjdd6ryhngf05r/13%20

        .PNG" alt="
        «Далее»11">

        <img src="https://astral.ru/upload/iblock/372/rzf1i91w64vr2tcst5dwk11jdv2p6n1y/14%20

        .PNG" alt="
        «Установить»13">

        <img src="https://astral.ru/upload/iblock/ab1/nrxmp1c7gbjmknix1o75f075tpqc6dfh/15%20

        .PNG" alt="
        подтвердить действие14">

      7. В случае если кнопка «Установить» отсутствует, то в окне «Сертификат для просмотра» нажать на «Свойства».
      8. <img src="https://astral.ru/upload/iblock/591/tpi8pi5vtl96xnm179odw9cxsbex6mg1/16%20

        .PNG" alt="
        картинка15">

        <img src="https://astral.ru/upload/iblock/88b/x5sfdt5u3crx3nnwiox49yau9gnksbg5/17%20

        .PNG" alt="
        картинка16">

      9. Далее нажать «Готово». После этого сертификат будет установлен.

      Кнопка «Установить личный сертификат»

      Ниже приведена инструкция, как установить сертификат Рутокен с расширением .cer. Для этого необходимо:

      1. Выбрать «Пуск» → «Панель управления» → «КриптоПро CSP» → вкладка «Сервис» → кнопка «Установить личный сертификат.».
      2. В окне «Мастер импорта сертификатов» нажать «Далее» → «Обзор» и выбрать файл сертификата.
      3. Указать путь к сертификату, нажать «Открыть» → «Далее» → «Далее».
      4. <img src="https://astral.ru/upload/iblock/6e1/7t7glwjv6l9z3tsst03p2fe1lrojb3al/18%20

        .PNG" alt="
        «Установить личный сертификат17">

        <img src="https://astral.ru/upload/iblock/152/w1imm951pvddqdgr75kw6q9uxivx3uw6/19%20

        .PNG" alt="
        «Далее»18">

        <img src="https://astral.ru/upload/iblock/a25/itmw6z8xk8h6dj8e3qd7noc23sfnqmf4/20%20

        .PNG" alt="
        «Обзор»19">

        <img src="https://astral.ru/upload/iblock/6be/qydfzucyvw18b2ijad2bi1u5dp99gab9/21%20

        .PNG" alt="
        «Открыть»20">

        <img src="https://astral.ru/upload/iblock/434/7swtbye1x8vdu58okl2aus713bfhhyig/22%20

        .PNG" alt="
        «Открыть»21">

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

    17. Указать контейнер закрытого ключа, соответствующий сертификату и нажать «ОK» → «Далее».
    18. В окне «Выбор хранилища сертификатов» нажать «Обзор».
    19. Установить отметку напротив «Установить сертификат в контейнер».
    20. Выбрать хранилище «Личные» и нажать «ОК».
    21. После выбора хранилища нажать «Далее» → «Готово».
    22. <img src="https://astral.ru/upload/iblock/e38/ex3n8yowmgzuq22xgseoiyazflppk44w/23%20

    .PNG" alt="
    «Личные»22">

    «ОК»23

    «Далее»24

    «Готово»25

    «Готово»26

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

    Заключение

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

    Скопировать подпись ИП или юрлица с Рутокен и других сертифицированных носителей невозможно технически. Данные действия считаются противоправными и квалифицируются законом как компрометация ключа подписи. Если ФНС установит факт компрометации, то вся подписанная таким ключом отчётность будет признана недействительной.

    ЭЦП:  Установка сертификатов безопасности, поддерживающих ГОСТ: m_i_kuznetsov — LiveJournal
    Оцените статью
    ЭЦП64