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

Дело в том, что контейнер цифровой подписи находится на Рутокене и имеет признак «Неэкспортируемый». Но экспортировать такой контейнер всё же можно. Копирование ЭЦП с Рутокена выполнять нужно с помощью специальной программы — tokens.exe. Скачать эту программу вы можете с сайта контура перейдя по ссылке.
Запустите tokens.exe, после чего эта программа обнаружит все ЭЦП на Рутокене. Возле нужного контейнера нажмите кнопку Экспорт и укажите путь к флеке на которую хотите скопировать контейнер электронной подписи.
После проделанного программа КриптоПро должна увидеть только что скопированный контейнер. Но это ещё не всё. Контейнер ЭЦП вы скопировали на флешку, но он продолжает быть неэкспортируемым. То есть вы не сможете сделать копию контейнера с помощью КриптоПро на другую флешку или в реестр. Чтобы это исправить воспользуемся ещё одной утилитой она также размещена на сайте Контура и называется Certfix.
Запустите Certfix, после чего загрузится список сертификатов. Дальше нужно зажать клавишу SHIFT на клавиатуре и правой кнопкой мыши кликнуть по нужному контейнеру. Появится меню «Сделать экспортируемым».

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

Довольно часто при оформлении сертификатов ключей электронной подписи можно наблюдать навязчивый пиар токенов с неизвлекаемым ключом. Продавцы из удостоверяющих центров уверяют, что, купив у них СКЗИ КриптоПРО CSP и токен с неизвлекаемым ключом (Рутокен ЭЦП или JaCarta ГОСТ), мы получим сертифицированные СКЗИ, обеспечивающие 100%-ную защиту от кражи ключей с токена. Но так ли это на самом деле? Для ответа на этот вопрос проведем простой эксперимент…
Конфигурация тестового стенда
- ОС MS Windows 7 SP1
- СКЗИ КриптоПРО CSP 3.9.8423
- Драйверы Рутокен для Windows (x86 и x64). Версия: v.4.1.0.0 от 20.06.2016, WHQL-certified
- Единый Клиент JaCarta и JaCarta SecurLogon. Версия 2.9.0 сборка 1531
- КриптоАРМ Стандарт Плюс 5. Версия 5.2.0.8847.
- Рутокен ЭЦП. Версия 19.02.14.00 (02)
- JaCarta ГОСТ. Номер модели JC001-2.F09 v2.1
Методика тестирования
- генерируется контейнер закрытого ключа и запрос на сертификат открытого ключа;
- после прохождения в удостоверяющем центре процедуры сертификации из запроса получается сертификат;
- сертификат в совокупности с контейнером закрытого ключа образует готовую для использования ключевую информацию. Данную ключевую информацию, записанную на носителе, будем называть исходным ключевым документом;
- с исходного ключевого документа изготавливаются копии, которые записываются на отчуждаемые носители (далее будем называть их рабочими ключевыми документами) и передаются уполномоченным пользователям;
- после изготовления необходимого количества рабочих ключевых документовисходный ключевой документ уничтожается или депонируется на хранение в орган криптографической защиты информации.
Проведение тестирования
Для этого с помощью КриптоАРМ создадим в реестре контейнер закрытого ключа test-key-reestr, содержащий самоподписанный сертификат (CN=test)
С помощью штатных средств СКЗИ КриптоПРО CSP (Пуск—>Панель управления—>КриптоПро CSP) скопируем ключевой контейнер test-key-reestr на ключевые носители Рутокен ЭЦП и JaCarta ГОСТ. Ключевым контейнерам на ключевых носителях присвоим имена test-key-rutoken и test-key-jacarta соответственно.
Описание приведено применительно к JaCarta ГОСТ (для Рутокен ЭЦП действия аналогичны):
Таким образом получили рабочие ключевые документы на JaCarta ГОСТ (контейнер test-key-jacarta) и Рутокен ЭЦП (контейнер test-key-rutoken).
Попробуем скопировать ключевые контейнеры test-key-rutoken и test-key-jacarta обратно в реестр.
Описание приведено для JaCarta ГОСТ (для Рутокен ЭЦП действия аналогичны).

Как мы видим, ключевая информация успешно скопирована или, другим языком, извлечена из токенов с неизвлекаемым ключом. Получается, что производители токенов и СКЗИ врут? На самом деле нет, и ситуация сложнее, чем кажется на первый взгляд. Исследуем матчасть по токенам.
Матчасть
То, что на рынке принято называть токеном с неизвлекаемым ключом, правильно называется функциональным ключевым носителем (ФКН) (доп. инфо).
Главным отличием ФКН от обычных токенов (Рутокен S, JaCarta PKI, …) в том, что при выполнении криптографических преобразований (например, формирование электронной подписи) закрытый ключ не покидает устройство. В то время как при использовании обычных токенов закрытый ключ копируется с токена в память комптьютера.
Использование ФКН требует особой организации взаимодействия между прикладным криптографическим ПО и библиотекой СКЗИ (криптопровайдером или, по-другому, CSP).

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

В последней строке указана фраза «Поддержка КриптоПРО ФКН: Нет», а это значит, что на токене нет апплета, с которым умеет работать СКЗИ КриптоПРО CSP. Таким образом, реализация технологии ФКН с использованием СКЗИ и токенов, описанных в конфигурации тестового стенда, невозможна.
Аналогичная ситуация и с JaCarta ГОСТ. Более того, СКЗИ КриптоПРО CSP, по крайней мере та версия, которая использовалась в тестовом стенде, использует данные ключевые носители как «обычные токены», которые, в свою очередь, являются просто носителями ключа.
Это утверждение очень просто подтвердить. Для этого надо поставить СКЗИ КриптоПРО CSP на чистую машину без драйверов от токенов и подключить токен JaCarta ГОСТ. ОС Windows 7 обнаружит токен JaCarta ГОСТ как «Устройство чтения смарт-карт Microsoft Usbccid (WUDF)». теперь можно попробовать создать ключ на токене и скопировать его в реестр компьютера. Весь функционал СКЗИ успешно отработает.
Как сделать, чтобы все было хорошо?
Чтобы с помощью продуктов ООО “КРИПТО-ПРО” реализовать технологию ФКН, необходимо:
1. Купить специальную версию библиотеки СКЗИ:
— для Рутокен ЭЦП — СКЗИ КриптоПРО Рутокен CSP.
— для JaCarta ГОСТ – СКЗИ КриптоПро ФКН CSP.
2. Одновременно с библиотекой СКЗИ необходимо приобрести специально подготовленные токены, содержащие в себе программные части (апплеты), с которыми умеет работать КриптоПРО Рутокен CSP или КриптоПро ФКН CSP соответственно.
Получается, что Рутокен ЭЦП и JaCarta ГОСТ не являются токенами с неизвлекаемым ключом?
Опять нет. Данные устройства могут реализовывать функционал ФКН (но, возможно, в меньшем объеме, чем при использовании их совместно с СКЗИ КриптоПРО), но для этого нужен софт, который умеет работать с апплетами размещенными на токенах. Таким софтом может быть КриптоАРМ Стандарт 5 Плюс. Он это умеет. При генерации ключевой пары в мастере КриптоАРМ можно выбрать криптопровайдер, который будет использоваться, например, Rutoken ECP или eToken GOST. Это и позволит использовать токен как ФКН.
LeXSofT
Главная страница. Подборки статей и гайдов, которые интересны мне.
Ссылки на разделы
16 апреля 2023
Переносим непереносимое и экспортируем не экспортируемое 2. Или «Как скопировать не экспортируемый ключ ЭП из ESMART Token и JaCarta?»
Сейчас же, я хочу описать свой опыт на тему «выдёргивания» ключа из esmart.
В этих наших интернетах, есть несколько статей по выдёргиванию ключей из JaCarta LT. В них, мельком упоминалось, что примерно так же, можно извлечь ключи и из esmart, но никаких подробностей не было.
Тут мне понадобилось извлечь ключик из esmart и я столкнулся с некоторыми моментами, а учитывая, что я не то, чтобы «кулхацкер» — некоторые моменты были мне не понятны.
Поэтому, после того, как всё получилось — я решил написать свою, более подробную инструкцию.
Нам понадобится:
1) Windows 7 (x86/x64), либо более поздние ОС, но с отключенным Secure Boot. Иначе, SmartcardSniffer работать не будет.
3) Strawberry Perl 5.32.1.1 32bit — Нужен для работы скрипта, разделяющего дамп по действиям.
4) Драйвера esmart.
Легче всего, вставить esmart в USB, зайти на i.kontur.ru и настроить рабочее место, например, под работу с Диадок. Тогда установятся все нужные компоненты. Кстати! Самое главное — не устанавливать компоненты, да и вообще не работать по RDP! Компоненты не запустятся. Если нужно работать удалённо — запустите AnyDesk, либо VNC (ну, или чем вы там любите подключаться?). Если не хотите лишнего ставить — попробуйте стянуть драйвера на сайте esmart
4.1) Драйвера JaCarta.
Ставятся точно так же, как и драйвера esmart через i.kontur.ru.
5) КриптоПро (Если зайдёте на i.kontur.ru — то криптопро скачается сама. Если ставите руками — то вот свежая версия)
7) Некоторые советуют Total Commander, но мне удобнее пользоваться Q-Dir.
В нём нужно настроить: Меню Настройки\Размер файлов, там поставить галочки: «Внутренний алгоритм Q-Dir» и «Размер в байтах».
Готовую, настроенную версию можно стянуть тут.
8) Smartcard Sniffer качаем SmartcardSniffer и оттуда достаём «SmartcardSniffer.dll» в моём случае, т.к. у меня Win7x86 — дёргаю файлик из папки SmartcardSniffer-0.1\SmartcardSniffer\bin\x86.
Его кидаем на диск C:\, в папку «SmartcardSniffer» (Желательно, сделать именно так, как в инструкции, т.к. команды, в дальнейшем, будут опираться именно на этот путь).
Так же, нужно поправить реестр:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows]
«AppInit_DLLs»=»C:\\SmartcardSniffer\\SmartcardSniffer.dll»
«LoadAppInit_DLLs»=dword:00000001
«RequireSignedAppInit_DLLs»=dword:00000000
9) Файл writeBinaryAPDU.pl (готовый файл лежит здесь)
Помещаем его в “C:\SmartcardSniffer\”
10) CertFix версии 1.1.27.3154. Нужен для конвертации ключа в экспортируемый. Про более старые — ничего не скажу, а вот новые уже не могут конвертировать. И самое поганое — при первом же запуске — программа сама обновится до новой версии. Поэтому, ей нужно обломать доступ в интернеты.
11) Firewall App Blocker. Нужен для блокировки доступа в интернет CertFix.
Устанавливаем все компоненты и ОБЯЗАТЕЛЬНО перезагружаем компьютер.
I. Собственно, сам процесс извлечения ключа из ESMART:
1) Получаем дамп диалога КриптоПро с токеном:
1.1) Вставляем ключ в ПК,
1.2) Запускаем КриптоПро,
1.3) Открываем вкладку «Сервис»,
1.4) Нажимаем «Протестировать»
1.5) Выбираем ключ и вводим пароль (кто не знал — стандартный пароль от ruToken и ESMART Token — 12345678, от JaCarta 1234567890 (в старых версиях (до 15.01.2019) стоял 1eToken), админские пароли можно глянуть тут и тут),
1.6) В открывшемся окне, смотрим пункт «Экспорт ключа» и убеждаемся, что он действительно не экспортируемый. Жмём «Готово» и закрываем программу.
1.7) В папке “C:\SmartcardSniffer\” появится дамп-файл «rundll32.exe.txt»
2) Разбиваем дамп на отдельные файлы:
2.1) Запускаем консоль (Win+R, пишем CMD и жмём «Enter»)
2.2) В консоли меняем папку командой: cd C:\SmartcardSniffer
2.4) Появится папка с кучей файлов
3) Собираем контейнер:
3.1) Первым идёт primary.key
3.1.1) Ищем файл, содержащий в названии 30_22
3.2) Далее, идёт файл masks.key:
3.2.1) Ищем файл с именем, содержащем 30_36
3.3) Ну и самый геморный файл — header.key:
3.3.1) Ищем самые большие файлы (для этого нам и понадобится Q-Dir с настройкой отображения байтов).
3.3.2) Берём файл, идущий перед ними (весит обычно, 16 байт и в названии содержит 83_02 (по крайней мере, у меня во всех случаях так было)) и тот, что идёт после них (он чуть меньше самых больших файлов (бывает так, что в конце, может быть два одинаковых по размеру файла. Берём любой(см скриншот ниже))).
Распишу подробнее: нам нужен первый файл, обычно, в ESMART Token он называется *_out(16)30_82_0A_BE, в JaCarta, называется *_out(16)30_82_0A_32.
После 30_82, названия могут быть разными, однако, «out(16)30_82» присутствует всегда (по крайней мере, на моей тачке, у ESMART Token и JaCarta — точно.
3.3.3) Копируем эти файлы в отдельную папку (в данном случае, я скопировал в C:\SmartcardSniffer\3)
3.3.4) В консоли меняем рабочую папку на C:\SmartcardSniffer\3 (ну, или на ту, в которую вы скопировали файлы) командой cd C:\SmartcardSniffer\3
3.3.6) В папке C:\SmartcardSniffer\3 появился файл header.key
3.4) Остаётся получить файл name.key. Конечно, можно его как-то вытащить из того сборища файлов, но легче взять готовый. Например, вот здесь. Отображаться в КриптоПро он будет как «Test_123», но потом, ключ легко будет переименовать после того, как вы сделаете его экспортируемым.
Если хотите — то вот вам файл с именами: esmart_1, esmart_2, esmart_3? jakarta_1, jakarta_2, jakarta_3, Export_1, Export_2, Export_3
3.4.1) Копируем файл в папку с primary.key, masks.key и header.key.
3.5) Переименовываем папку в «1234» (можно использовать любые 12 символов, (цифры и ТОЛЬКО латинские буквы) и закидываем папку на любую флешку или жёсткий диск, имеющий любую букву, кроме диска C:\ (я использую виртуальный диск (VHD). Примонтировал такую виртуальную «флешку» и балуешься).

2) Запускаем CertFix от имени администратора и находим наш ключ. Смотрим на столбец «Экспорт закрытого ключа» и видим параметр «DENIED».
3) Зажимаем клавишу «Shift» на клавиатуре, нажимаем правой кнопкой мыши по ключу и выбираем пункт «Сделать экспортируемым (файловая система)».
5.1) Запускаем КриптоПро, там жмём вкладку Сервис;
5.2) Жмём кнопку «Скопировать. »
5.3) Затем, кнопку «Обзор. »
5.4) Выбираем контейнер и жмём кнопку «Ок»
5.5) Можем задать другое имя контейнеру (я оставил по умолчанию), жмём «Готово»
5.6) Выбираем носитель (у меня Rutoken Lite), жмём «Ок»
5.7) Готово!
5.8) Тестируем сертификат.
Вот в виде видео:
Ну, и собственно всё. Позже, выложу ссылки на сборник программ в одном архиве и образ виртуалки VMWare с настроенной виндой под ESMART и JaCarta.
Блог вопиющего в пустыне
Первоначально решение нашел на этом портале: https://itnan.ru/. И действовал по алгоритму, который там был приведен, но с одним исключением: ссылки на две утилиты, необходимые для экспорта «неэкспортируемого ключа», там не работали. Поэтому нашел еще один ресурс, где кроме этих утилит в архивеTokens_CertFix.zip находились и другие инструкции по экспорту. Скачать можно по этой ссылке https://www.upload.ee/files/13892259/Tokens_CertFix.zip.html.
А. Копирование контейнера закрытого ключа на USB-флеш-накопитель.
Перед тем как запустить утилиту Tokens.exe проверил тип носителя контейнера с «неэкспортируемым ключем», т.к. на момент написания статьи имелись следующие экспериментальные сведения о поддерживаемых утилитой Tokens.exe типах носителей:
Рутокен (старый несертифицированный), Рутокен S, Рутокен Lite — поддерживаются ;
Рутокен ЭЦП 2.0, JaCarta LT, ESMART Token ГОСТ — на момент написания статьи (январь 2022 года) не поддерживались .
У меня тип носителя был Рутокен Lite .
Поэтому далее действовал по приведенным на порталах инструкциям.
1) Подключил Рутокен и чистый USB-флеш-накопитель к компьютеру.
2) Запустил утилиту Tokens.exe.
Если на данном шаге появилось вот такое сообщение:
Кликните по каждой ссылке (1.CAPICOM, 2.Компонент диагностики Рутокен, 3.Ресурсы СКБ Контура добавлены в надежные узлы, и произведена настройка надежной зоны) и установите эти компоненты .
3) У нужного контейнера нажал «Экспорт».
4) Для экспорта указал путь к USB-флеш-накопителю.
5) Переименовал контейнер. Имя можно задать любое, отличное хотя бы на 1 символ от исходного.
6) Вынул из системника Рутокен и оставил USB-флеш-накопитель
Б. Снятие флага «экспорт запрещён» в скопированном на USB-флеш-накопитель контейнере.
1) Отключил интернет .
2) Запустил утилиту CertFix.000032.exe, загрузился список сертификатов и напротив строки «Поиск» появилась надпись «Загрузка завершена».

3) В списке выделил свой сертификат — справа в колонке экспорта стоял DENIED, нажал Shift и правый(!) клик мышкой, появилось меню с опцией «сделать экспортируемым (файловая система)».
4) Кликнул на эту опцию и задал пароль (обязательно). Готово, ключ в контейнере на флешке приобрел статус «экспортируемый».
В. Копирование контейнера закрытого ключа с USB-флеш-накопителя в реестр.
Делается стандартными средствами через КриптоПро CSP. Можно посмотреть здесь: https://zakupki-32.ru/blog/na-styke-realnogo-i-virtualnogo/pri-podklyuchenii-po-rdp-k-udalennoy-mashine-brauzer-ne-vidit-rutoken.php . Только вместо Рутокена в USB-порт вставляем USB-флеш-накопитель со скопированным на него контейнером закрытого ключа.
Г. Устанавливаем сертификат контейнера закрытого ключа в хранилище сертификатов.
Делается стандартными средствами через КриптоПро CSP: в меню «Сервис» нажать кнопку «Посмотреть сертификаты в контейнере», нажать на «Обзор», в открывшемся окне «Выбор ключевого контейнера» в «Списке ключевых контейнеров» выделить строку, где в столбце «Считыватель» указано «Реестр». Нажать «Ок».
Потом «Далее». В окне «Сертификат для просмотра» нажать «Свойства». В открывшемся окне «Сертификат» нажать «Установить сертификат» и поместить его в хранилище «Личное».