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

Также далее пишу, как преобразовать его в openssl-формат, пригодный для Diadoc API и других.

Предполагается, что обычный доступ по токену у вас и так работает, в интернет куча инструкций на эту тему.

Проблема в том, что ФНС ставит на токене флаг "экспорт запрещён". Большинство стандартных средств экспорта перестают работать.

Предупреждение! Флаг стоит не просто так. Ключ, полученный в ФНС, имеет очень много полномочий. Пока ключ на флешке, он защищён гораздо лучше, чем в вашей файловой системе.

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

ФНС использует два типа токенов. Первый, вроде бы, дают, если идет работа с алкоголем (ЕГАИС), и там шифрование аппаратное, ключ не покидает токен, в этом случае, насколько я слышал, чисто программно сделать ничего нельзя.

Если же вы алкоголь не продаете, то можно использовать обычный токен (у меня рутокен). И там все проще, запрет экспорта - чисто программный флажок, который можно снять, детали далее.

Копирование на файловую систему

Вначале создадим копию контейнера с токена на файловую систему.

Для этого понадобится утилита (под Windows).

Качаем, запускаем, она выдает ошибку и просит поставить компоненты дополнительно по ссылкам - ставим их. После этого втыкаем токен и перезапускаем утилиту.

Токен появляется в списке, экспортируем его. Можно выбрать имя директории, я назвал FNS.000 (расширение 000 использует Crypto Pro).

В итоге у вас появляется директория с файлами: header.key и другими. Это сертификат вместе с закрытым ключом в формате Crypto Pro.

Фактически этим уже можно пользоваться. У меня основная система Mac, уже было настроен Crypto Pro, я просто скопировал FNS.000 в директорию /var/opt/cprocsp/keys/iliakan, далее запустил CryptoPro Tools и там Containers - выбираю нужный контейнер - Install certificate.

Затем браузер Chromium-Gost (там ГОСТ-шифрование, обычный Chrome не подойдет) с установленным расширением КриптоПро автоматически видит этот сертификат - и доступ на сайт налоговой работает, прямая ссылка: https://lkipgost2.nalog.ru/lk.

Под Windows нужно, видимо, в аналогичную директорию скопировать, кто знает - дополните в комментариях?

Если ваша задача была сделать архив токена или отвязать его от флешки - она выполнена. Дальше можно не читать ;)

Предупреждение! Ещё раз замечу, что такое копирование вы делаете только по необходимости. Если на компьютерный диск - он должен быть как минимум зашифрован, и к нему не должны иметь доступ люди, которые могут запустить что попало из интернет. Более-менее безопасный сценарий - копирование с целью создать архив токена зашифрованный на всякий случай.

Снятие запрета на экспорт

В скопированном с токена контейнере все еще стоит флаг "экспорт запрещён". Это естественно, ведь по сути директория-контейнер - это копия токена, с соответствующими флагами.

Снять его может другая утилита: CertFix, но не последней версии, а более старая, certfix.000032.exe, которую с сайта официального убрали, но легко можно найти в интернете (md5 сумма файла: 34e97594896db540911731ce8c9e2bf5, на всякий случай).

Это может быть нужно, чтобы подготовить сертификат для конвертацию в формат openssl (для API). Просто чтобы пользоваться для взаимодействия через браузер с госслужбами - снимать флаг не обязательно.

Для этого копируем директорию с файлами на флешку (важно именно на флешку), в корень, и, выключив интернет (!) запускаем certfix.000032.exe. Если не выключить, то эта утилита обновится, а в последней версии опция, о которой идет речь ниже, отключена.

В списке находим свой сертификат - справа в колонке экспорта будет стоять DENIED, жмем Shift и правый(!) клик мышкой, появится меню с опцией "сделать экспортируемым (файловая система)".

Клик на эту опцию и задаём пароль (обязательно).

Готово, файлы на флешке обновлены, внутри FNS.000 появилась поддиректория с бэкапом и файл .backup - можно их удалить.

Это всё ещё сертификат в формате Крипто Про, только с разрешённым экспортом. Пользоваться так же, как и ранее.

Конвертация в формат для OpenSSL

Для взаимодействия с API обычно используют openssl.

К сожалению, в сертификатах РФ используется свой стандарт шифрования (ГОСТ), поэтому обычный openssl не подходит, нужен патченный.

Если вас занесла нелёгкая в эти дебри, то наверно вы уже это знаете про патч. Его можно собрать самостоятельно, но гораздо проще - поставить docker-контейнер, в котором оно уже готовое.

Вот нужный образ. Если вы не знаете, что такое docker - отличный повод изучить, это очень просто. Во всяком случае, прочитать с нуля про основы и поставить/запустить, расшарить каталог с сертификатом - займёт в пределах 1-3 часов.

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

При сборке она меняет системный openssl, так что имеет смысл собирать её в отдельном docker-контейнере под Linux, можно в том же самом что и выше.

Затем запускаем, как там в readme указано: ./get-cpcert FNS.000 "пароль, выбранный при экспорте" > certificate.pem.

В результате из Crypto Pro формата появляется аккуратный файлик с сертификатом и приватным ключом в формате PEM.

Всё, можно с этим уже делать что угодно, отсылать через openssl запросы к любым API. Из PEM сертификат можно в любой другой популярный формат конвертировать тем же OpenSSL.

P.S. После публикации этой статьи с сайта Контура пропали утилиты, которые позволяли это делать.

Прошу прокомментировать, почему их убрали?

Комментарии (14)


  1. t3chn0ph0b
    18.01.2022 11:31
    +1

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


  1. DMC
    18.01.2022 11:41

    Этот сертификат не получится в VipNet CSP импортировать? 10 лет на нем сидим на сервере и необходимость покупки серверной Crypto Pro как-то не очень радует.


    1. iliakan Автор
      18.01.2022 11:42

      Скорее всего, получится. Сертификат-то в стандартном открытом формате в итоге, его куда угодно можно. Из PEM можно легко в любой другой формат конвертнуть тем же OpenSSL.

      Надо, чтобы ГОСТ шифрование поддерживалось, в VipNet CSP оно есть.


      1. DMC
        18.01.2022 11:52

        Отлично, спасибо! Попробую на днях.


  1. Theo730
    18.01.2022 12:41

    Недавно тоже была задача с ключем с ГОСТ 3410 на linux debian. Поступил проще - перенес контейнер в папку windows. Далее забрал файлы (6 штук) из папки, путь можно увидеть в по для работы с ключем и скормил https://github.com/kov-serg/get-cpcert. - получил привантый/открытый ключ. И для семейства debian libengine-gost-openssl1.1 - в репозитарии. Тут главное заставить запускаться openssl с измененным конфигом, мой debian по-умолчанию не берет даже стандартный конфиг. Выход - добавить переменную окружения OPENSSL_CONF="/etc/ssl/openssl_custom.cnf"


    1. iliakan Автор
      18.01.2022 14:36

      Вы собрали вручную. Да, это возможно. Конфиг надо при этом править. В системе будет по дефолту старая openssl, возможно, с уязвимостями.

      Я остановился на варианте с докером, как более простом с точки зрения админской поддержки.


  1. AlexandreFrolov
    18.01.2022 13:48

    Чего-то ссылка https://api.kontur.ru/drive/v1/public/diag/files/certfix.000032.exe не работает


    1. iliakan Автор
      18.01.2022 14:28

      Убрали =) Похоже, прочитали мой пост. В интернет можно найти много где эту версию, md5: 34e97594896db540911731ce8c9e2bf5


      1. DMC
        18.01.2022 15:11

        Tokens.zip тоже всё. Может кто успел скачать утилиты и выложит или отправит в личку урл?


  1. iliakan Автор
    18.01.2022 14:25

    Похоже кто-то подредактировал мой пост, поменял текст на ссылки. Тут модераторы такое делают?


    1. rsashka
      18.01.2022 14:46

      Да, делают, но исключительно косметические правки (как например текст на ссылки).

      А если потреубется править текст статьи, то тебе НЛО напишет, а при срочной необходимости просто скроет в черновиках пока не исправишь (проверено на собственном опыте ;-) ).


      1. iliakan Автор
        18.01.2022 14:55

        Там была замена символа ">" (перенаправление вывода) на → (стрелка). Похоже, модератор не очень понимает, что такое потоки ввода-вывода, и почему нужно именно >

        Надеюсь, других ошибок не понасажал. Если что не так в статье - это не я, это все модератор! ;)


        1. rsashka
          18.01.2022 14:57

          Это может делать редактор при сохранении текста статьи на сайте.


          1. iliakan Автор
            18.01.2022 15:01

            Может и редактор (человек). Это произошло через час после сохранения. При сохранении все было ок.