Как скопировать не экспортируемый ключ ЭП из ESMART Token и JaCarta?

?>
image.png

Нам понадобится:

1) Windows 7 (x86/x64), либо более поздние ОС, но с отключенным Secure Boot. Иначе, SmartcardSniffer работать не будет.

2) Редист Microsoft Visual C++ 2010 x86 (если не установлен) 

3) Strawberry Perl 5.32.1.1 32bit - Нужен для работы скрипта, разделяющего дамп по действиям. 

4) Драйвера esmart.
Легче всего, вставить esmart в USB, зайти на i.kontur.ru и настроить рабочее место, например, под работу с Диадок. Тогда установятся все нужные компоненты. Кстати! Самое главное - не устанавливать компоненты, да и вообще не работать по RDP! Компоненты не запустятся. Если нужно работать удалённо - запустите AnyDesk, либо VNC (ну, или чем вы там любите подключаться?). Если не хотите лишнего ставить - ссылка на скачивание.

4.1) Драйвера JaCarta.
Ставятся точно так же, как и драйвера esmart через i.kontur.ru.

5) КриптоПро (Если зайдёте на i.kontur.ru - то криптопро скачается сама. Если ставите руками - то вот свежая версия)

6) WinHEX

7) Некоторые советуют Total Commander, но мне удобнее пользоваться Q-Dir
В нём нужно настроить: Меню Настройки\Размер файлов, там поставить галочки: "Внутренний алгоритм Q-Dir" и "Размер в байтах". 

0001.png

Готовую, настроенную версию можно стянуть тут.

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) В открывшемся окне, смотрим пункт "Экспорт ключа" и убеждаемся, что он действительно не экспортируемый. Жмём "Готово" и закрываем программу.

002.png

1.7) В папке “C:\SmartcardSniffer\” появится дамп-файл "rundll32.exe.txt"

003.png

2) Разбиваем дамп на отдельные файлы:
2.1) Запускаем консоль (Win+R, пишем CMD и жмём "Enter")
2.2) В консоли меняем папку командой: cd C:\SmartcardSniffer

004.png

2.3) Пишем команду perl writeBinaryAPDU.pl < rundll32.exe.txt

005.png
006.png

2.4) Появится папка с кучей файлов

007.png

2.5) Сразу, чтоб облегчить жизнь, в папке, жмём Ctrl+F, в поиске вбиваем "in" и удаляем все файлы, содержащие в названии это слово.

008.png

3) Собираем контейнер:
3.1) Первым идёт primary.key
3.1.1) Ищем файл, содержащий в названии 30_22

009.png

У меня он один, но у вас могут быть их несколько.
3.1.2) Выбираем тот, что по меньше и перетаскиваем в WinHEX.

010.png

3.1.3)Видим, что в конце стоят нули. Подрезаем файл до 36 байт (у меня это были все нули):
3.1.3.1) Ставим курсор на последний ноль, зажимаем клавишу Shift и стрелочками двигаем курсор, выделяя данные (лучше выделить не все нули, а оставить сначала половину и посмотреть, сколько данных обрезали).
3.1.3.2) Жмём клавишу Del и смотрим сколько отрезали. Должно остаться 36 байт.

011.png

3.1.4) Сохраняем файл под именем primary.key куда-нибудь отдельно (я сохранил в C:\SmartcardSniffer\2)

 

3.2) Далее, идёт файл masks.key:
3.2.1) Ищем файл с именем, содержащем 30_36

012.png

3.2.2) Подрезаем его до 56 байт (так же как предыдущий) и сохраняем под именем masks.key.

 

3.3) Ну и самый геморный файл - header.key:

3.3.1) Ищем самые большие файлы (для этого нам и понадобится Q-Dir с настройкой отображения байтов).

3.3.2) Берём файл, идущий перед ними (весит обычно, 16 байт и в названии содержит 83_02 (по крайней мере, у меня во всех случаях так было)) и тот, что идёт после них (он чуть меньше самых больших файлов (бывает так, что в конце, может быть два одинаковых по размеру файла. Берём любой(см скриншот ниже))).

013.png

Распишу подробнее: нам нужен первый файл, обычно, в ESMART Token он называется *_out(16)30_82_0A_BE, в JaCarta, называется *_out(16)30_82_0A_32.
После 30_82, названия могут быть разными, однако, "out(16)30_82" присутствует всегда (по крайней мере, на моей тачке, у ESMART Token и JaCarta - точно.

014.png
В моём случае, их было 12. Может быть 14 (например, как у JaCarta)

 

3.3.3) Копируем эти файлы в отдельную папку (в данном случае, я скопировал в C:\SmartcardSniffer\3)

3.3.4) В консоли меняем рабочую папку на C:\SmartcardSniffer\3 (ну, или на ту, в которую вы скопировали файлы) командой cd C:\SmartcardSniffer\3

015.png
3.3.5) Пишем команду copy /B * header.key и жмём энтер
016.png
3.3.6) В папке C:\SmartcardSniffer\3 появился файл header.key
017.png
3.3.7) Его помещаем в папку к другим файлам.
018.png

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). Примонтировал такую виртуальную "флешку" и балуешься).

019.png

3.6) Снова запускаем КриптоПро и находим сертификат.

020.png

3.7) Убеждаемся, что ошибок не обнаружено.

021.png
3.8) В принципе, ключ уже можно использовать так. Многие так и делают: закидывают папку на флешку и спокойно работают. Но можно пойти дальше и сделать ключ экспортируемым (на сколько это видно госорганам, когда подключаешься к их порталам - я не знаю. Но есть люди, которым принципиально нужно скопировать ключ на токен и использовать его как раньше.
Описание по конвертации ключа в экспортируемый, перейдите в раздел III. 
 
II. Процесс извлечения ключа из JaCarta:
 
1) Выполняем пункты с 1 по 3.2.2, пункт 3.3 тоже похож, только файлов может быть меньше и после удаления файлов *in*, нужные нам файлы будут идти практически по порядку.
022.png
2) Ровно таким же способом, как описано в пунктах с 3.3.1 по 3.3.7 собираем  header.key
3) И так же, используем любой name.key
 
III. Конвертация не экспортируемого ключа в экспортируемый.
 
1) Запускаем Firewall App Blocker и запрещаем CertFix выход в интернет (я на всякий случай запретил как входящие, так и исходящие подключения).
023.png
024.png
025.png

2) Запускаем CertFix от имени администратора и находим наш ключ. Смотрим на столбец "Экспорт закрытого ключа" и видим параметр "DENIED".

3) Зажимаем клавишу "Shift" на клавиатуре, нажимаем правой кнопкой мыши по ключу и выбираем пункт "Сделать экспортируемым (файловая система)".

027.png

4) После чего, получаем уведомление, что всё прошло успешно и резервная копия лежит в папке контейнера.

28.png

Если зайти в папку с ключом - можно увидеть каталог бэкапа.

29.png

5) Ну а дальше всё просто:
    5.1) Запускаем КриптоПро, там жмём вкладку Сервис;
    5.2) Жмём кнопку "Скопировать..."
    5.3) Затем, кнопку "Обзор..."
    5.4) Выбираем контейнер и жмём кнопку "Ок"
    5.5) Можем задать другое имя контейнеру (я оставил по умолчанию), жмём "Готово"
    5.6) Выбираем носитель (у меня Rutoken Lite), жмём "Ок"
    5.7) Готово!
    5.8) Тестируем сертификат.

Вот в виде видео: