Скопировать неэкспортируемый контейнер
На сегодняшний день практически каждый предприниматель имеет электронную цифровую подпись(ЭЦП), раньше их выпускало множество компаний, сейчас же получить ЭЦП можно получить только через налоговую(ФНС) или через другие крупные аккредитованные центры, например сбербанк, но для этого еще нужно предоставлять дополнительные документы, поэтому наиболее простой способ — получить подпись в налоговой.
Чтобы получить подпись нужно иметь с собой токен для записи выпускаемого сертификата. Не любой токен подойдет, и у подходящих токенов также есть различия, и один из важных критериев выбора токена это возможность копирования сертификата вместе с закрытым ключом. Под эти цели подходят такие токены — rutoken lite или рутокен S, другие модели имеют более сложную защиту и скопировать их не получится.
А зачем вообще их копировать? — это актуально для компаний имеющих в своем штате несколько сотрудников работающих с документами, ЭДО и отчетностью. Т.е. вместо того чтобы оформлять подпись каждому сотруднику, выпускать доверенность на него, можно просто скопировать сертификат на все нужные компьютеры и подписывать все документы от лица руководителя организации.
Инструкция по копированию ключа
В первую очередь нужно скопировать токен с сертификатом на обычную флешку, копирование проводится при помощи программы tokens.exe.
Запустите программу tokens.

Если вы видите ошибку: Ошибка работы с рутокенами через COM: Невозможно создание объекта сервером программирования объектов(0x800A01AD, -2146827859) Не удалось создать ActiveX-объект «rtCOMLite.rtContext» (rtComLite.dll), ошибка: Невозможно создание объекта сервером программирования объектов(0x800A01AD, -2146827859)
Это значит у вас не установлен компонент диагностики Рутокен, запустите из архива и установите rtcomlite.000185.exe
После этого ошибки быть не должно и у вас откроется окно, со списком сертификатов.


Вводим имя(по желанию) нажимаем ОК.
После копирования, в корне флешки появится папка с файлами токена.

Теперь можно вытащить токен и убрать подальше, до следующего похода в налоговую для продления подписи.
Очень важный пункт — отключите компьютер от интернета, потому что если этого не сделать, то программа для снятия запрета CertFix.001069.exe копирования обновится, а в новой версии этой возможности уже нет.
После отключения интернета, запускаем CertFix.001069.exe, и видим список всех сертификатов на компьютере.


Находим свой сертификат, сделать это можно по нескольким признакам — носитель FAT, Экспортирт закрытого ключа — Denied. Нашли?
Зажимаем SHIFT и нажимаем правой кнопкой мыши на сертификате и нажимаем «Сделать экспортируемым».
Все, наш сертификат доступен для копирования! Запускаем КриптоПро и спокойно копируем сертификат вместе с закрытым ключом в реестр. Делаем это на всех нужных компьютерах.

Начиная с 2022 года копирование сертификата выданного ФНС запрещено. Я не буду рассматривать правовую сторону этого вопроса, но меню интересовала именно техническая сторона. Собственно, я задался вопросом – можно ли по факту выполнить копирование сертификата ФНС.
В процессе поиска я нашел довольно подробное описание этого процесса. Я попробовал один из этих методов на одном из сертификатов – даже получилось. И решил сделать краткую выжимку.
Операционная система: Windows 10 Professional X64 RUS.
Крипто Про: КриптоПро CSP 5.0.12000 (Kraken).
ЭЦП на Рутокен Lite.
Как оказалось, экспорт можно выполнить следующими инструментами:
Копирование сертификата ФНС
На момент подготовки публикации у меня не было под рукой рутокена с ЭЦП для более подробных скриншотов, но постараюсь изложить основную последовательность шагов.
1. Сначала необходимо использовать утилиту Token.exe для экспорта сертификата с рутокена на второй USB накопитель. Запустить от имени администратора. В списке утилиты сертификаты отображаются в соответствии с их цифровыми идентификаторами, а не дружественными именами. Нужно выбрать правильный сертификат.
2. Отключаем накопитель с рутокен.
3. Отключаем доступ в интернет с рабочего места, где будет запускаться CertFix.
4. Затем необходимо использовать утилиту CertFix. Запустить нужно от имени администратора. В списке находим сертификат со второго USB накопителя. Зажимаем Shift и щелкаем правой кнопкой мыши по нужному сертификату. В контекстном меню выбираем пункт “Сделать экспортируемым (файловая система)”.
5. Готово. Проверяем.



Примечание
Автор ПО и методики — Сергей Солдатов
Данный способ работает не только на JaCarta LT и ESMART Token (нет личного опыта только сторонний отзыв, и непонятно какая именно модель 64K или ГОСТ).
Данное способ точно не работает на токенах Рутокен ЭЦП 2.0 и токенами формата PKCS#11
Что понадобится
perl writeBinaryAPDU.pl < rundll32.exe.txt
Для хлебушков, команда выполняется в папке, где лежит файл rundll32.exe.txt
В результате rundll32.exe.txt будет разобран на бинарные файлы (появится отдельная папка) вида “001_out
39_6A_42_32”, где:001 – идентификатор последовательности запрос-ответ;out – направление передачи: out – из токена в приложение, in – от приложения в токен;
– количество переданных/полученных байтов;39_6A_42_32 – первые 4 байта.
Собираем контейнер
primary.key – размер 36 байт, начинается с 30_22_04_20
Ищем файлы вида №_out
30_22_04_20. У меня таких было 2 штуки, размером по 80 байт, начало одинаковое, в конце нули, взял один и обрезал через WinHex до 36 байт, результат сохранил как primary.key

masks.key – размер 56 байт, начинается с 30_36_04_20
Ищем файлы вида №_out
30_36_04_20. У меня таких было 2 штуки, размером по 64 байта, одинаковые, в конце нули, взял один и обрезал через WinHex до 56 байт, результат сохранил как master.key

header.key – самый большой файл.
Находим файлы с самым большим объёмом, плюс берём кусок до и кусок после. У меня таких файлов было много, но их все можно было разбить на группы и получилось 6 групп по 16 файлов (18 если учитывать нулевые).

Копируем все файлы в “C:SmartcardSnifferheader” и склеиваем их командой:
copy /B * header.key

name.key – тут есть два варианта:
Если с первым пунктом всё понятно, то со вторым чуть интересней. В дампе ищем файл — следующего вида №_out(длина имени)30_длина имени_16_длина имени – 2.
Интересен тот факт, что содержимое этого файла, в целом, не важно, поэтому можно сгенерить свой файл name.key, с соблюдением формата его первых четырех байт.
У себя я нашел один такой файл, 163_out
30_26_16_24. Из него и сделал name.key.


И накидал в него данных, чтобы привести его виду обычного name.key из рабочего контейнера:

Результат сохранил как name.key
