Криптография
August 3

Тащим ключи с Рутокен Lite

Суть такова

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

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

Скриншот из Центре управления Рутокен'ом

Также следует упомянуть, что существует популярная утилита Tokens.exe от СКБ Контур, однако у неё есть ряд недостатков:

  1. Утилита работает только на Windows
  2. Написана на HTML с использованием устаревшего ActiveXObject с связке с DLL
  3. Утилиту благополучно "выпилили" с сайта, поэтому приходится искать по всему интернету

Тащим ключи

1. Ищем контейнер

Рутокен Lite - не совсем флешка в привычном понимании, у него максимально облегченная файловая система, поэтому просто открыть его в проводнике не получится

Однако для этих целей можно воспользоваться утилитами от проекта OpenSC

Важно: Данная статья предполагает, что у вас уже установлены opensc-tool и opensc-explorer

Поэтому подключаем Рутокен, открываем консоль и вводим opensc-tool --list-files

Файловая система Рутокена

Среди всего списка необходимо найти директорию с 6 файлами, часть из которых доступна для чтения только после авторизации (read[CHV2]). Сделать это легче всего по имени контейнера в КриптоПро, поскольку opensc-tool декодирует ASCII текст:

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

Файл на скриншоте это name.key, а директория с контейнером (выделена жёлтым) в нашем случае будет 3f00100010030a00

UPD от 05.08: Вероятнее всего все контейнеры действительно лежат по пути 1000/1003. Соответственно при помощи команды asn1 искать по имени контейнера:

name.key и header.key второго контейнера на Рутокене

2. Выгрузка

Запускаем opensc-explorer и переходим в директорию контейнера с помощью команды cd <путь>

Важно: Необходимо разделить путь директории на группы по 4 символа и убрать 3f00, в нашем случае это будет 1000, 1003, 0a00

В директории файлы лежат в следующем порядке: name.key, header.key, primary.key, masks.key, primary2.key, masks2.key

Файлы контейнера

Теперь самый важный пункт - необходимо авторизоваться по PIN-коду пользователя (в противном случае Рутокен даст выгрузить только name.key и header.key). Сделать это можно с помощью команды verify CHV2 "PIN-код"

Успешная авторизация

Теперь же просто копируем файлы контейнера в память компьютера с помощью команды get File_ID путь_назначения

На этом всё, мы успешно скопировали контейнер с Рутокен Lite в память нашего компьютера. Далее желательно "пролечить" контейнер, чтобы "включить" флаг экспортируемости, но на текущий момент решение ещё в разработке (оповещение о релизе будет в Telegram канале). To be continued...

Бонус. Экспорт приватного ключа

Для удобства использования ключа подписи, его можно экспортировать в формат .pem (с которым умеет работать OpenSSL и прочие утилиты) с помощью моей онлайн-утилиты
В утилиту загружаем файлы header.key, masks.key и primary.key, поле "Пароль" оставляем пустым (поскольку контейнеры на Рутокенах не имеют пароля т.к происходит авторизация по PIN-коду) и нажимаем "Извлечь", через несколько секунд скачается .pem файл с приватным ключом.