Закрытый ключ КриптоПро CSP представляет из себя флеш-накопитель, на котором в директории ххххх.000 лежат файлы primary.key, primary2.key, masks.key, masks2.key, name.key и header.key.

Такие ключи читаются только программой CryptoProJCP, серверная лицензия которой стоит на данный момент 120 тыс рублей.

Но наша задача – получить .p12 контейнер с наименьшими затратами.

C контейнером .p12 можно работать из java например с помощью библиотеки bouncycastle.

Но это уже тема следующей статьи.

Шаг 1.

Для экспорта ключа нам поможет замечательная утилита P12FromGostCSP, которая позволяет конвертировать ключ в формат .pfx

Мы вставляем флешку, запускаем утилиту и выбираем ключ для преобразования. Далее указываем пароль на хранилище и на выходе получим хранилище формата .pfx

Впрочем, это только начало, так как после конвертации контейнер все еще недоступен для чтения из java.

Шаг 2.

Далее нам потребуется с помощью OpenSSL извлечь закрытый ключ и сертификат и поместить их в .p12 хранилище.

Но есть проблема - OpenSSL из коробки не работает с алгоритмом ГОСТ 2012
Для этого нам потребуется программа openssl с поставленным на нее дополнением gost engine (ссылка тут). Нам необходимо установить это дополнение, следуя инструкциям, скомпилировав его из исходников.

Но есть вариант попроще...

Мы можем воспользоваться докер-контейнером, в котором уже установлен OpenSSL вместе с дополнением для корректной работы с алгоритмом ГОСТ 2012.

Ссылка на статью с описанием работы с данным докер-образом: Docker-образы с поддержкой ГОСТ-сертификатов в openssl, curl, php, nginx

В самом простом варианте нам требуется запустить этот докер-контейнер, подключиться к нему пробросив volume и выполнить пару консольных команд для извлечения закрытого ключа и сертификата из .pfx и помещения их в .p12

Запустим контейнер, пробросив папку tmp. В ней будем выполнять преобразования.

docker run -v "c:/tmp:/usr/tmp" --rm -i -t rnix/openssl-gost bash

Шаг 3.

#Достаем ключ
openssl pkcs12 -in gost.pfx -out gost.key -nocerts

#После команды задаем пароль для ключа.

#Достаем сертификат
openssl pkcs12 -in gost.pfx -out gost.cer -nokeys

#Объединяем их в хранилище p12, задавая ключу имя prod, его нужно будет прописать в application.properties как key.alias
openssl pkcs12 -export -inkey gost.key -in gost.cer -out gost.p12 -name prod

Полученное хранилище gost.p12 и сертификат gost.cer можно вставлять в папку resources/security. Не забываем указать все пароли и логины, а также имена файлов в application.properties.

P.S. Если тема интересна, напишу статью как сделать сервис на spring boot, который будет подписывать файлы и сообщения с помощью ключа и сертификата в .p12 контейнере по алгоритму ГОСТ 2012.

Спасибо за внимание :)

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


  1. Sap_ru
    21.08.2023 22:57
    +1

    "Неизвлекаемые" можно сконвертировать ?
    Так как если к этому добавить утилиту, которая перехватывает ключ из USB-накопителя (как мы помним RuToken.Lite это полнейшая профанация и неизвлекаемость там делается программно битом файле ключа)... то можно наконец копировать ключи, которые пишет дурацкая налоговая!


    1. aborouhin
      21.08.2023 22:57
      +1

      Да их и так можно копировать... общеизвестный способ, утилита tokens.exe правильной версии в помощь. Или я чего-то не понял?


      1. itmind
        21.08.2023 22:57

        Подскажите, как с токенов JaCarta скопировать?. Вариант с CertFix.exe не подходит


        1. aborouhin
          21.08.2023 22:57

          Я только вариант с копированием с Рутокен Лайт знаю. Если с JaCarta никак не получается, но очень надо - в принципе, можно в ФНС перевыпустить с записью на Рутокен...


    1. itshnick88
      21.08.2023 22:57

      Вы путаете понятия "неизвлекаемый" и "неэкспортируемый". В Rutoken Lite технически не может быть реализована неизвлекаемость, только флаг неэкспортируемости.


      1. Sap_ru
        21.08.2023 22:57

        Это не я путаю. Это RuToken брешет. Сам ключ не экспортируемый, ясен перец.


  1. Evengard
    21.08.2023 22:57

    pfx и p12 это на самом деле один и тот же формат. Другое дело, что bouncycastle поддерживает не все методы шифрования данных внутри него. Из-за этого и такие танцы с бубном...

    Но я почти уверен что силами bouncycastle можно было бы создать сразу из исходных файлов нужный p12.


    1. Evgenii_Liashov Автор
      21.08.2023 22:57

      Да, все верно p12 и pfx одно и тоже, но проблема в том что после преобразования утилитой P12FromGostCSP контейнер почему-то не читается bouncycastle.
      Помогает выгрузка ключа и сертификата из контейнера и помещение их в новый контейнер.


  1. Pochemuk
    21.08.2023 22:57

    Закрытый ключ КриптоПро CSP представляет из себя флеш-накопитель, на котором в директории ххххх.000 лежат файлы

    Контейнер закрытого ключа - это не только флеш-накопитель. Кроме него это может быть крипто-токен, раздел реестра, просто директория на жестком диске.

    Собственно говоря, если контейнер расположен на диске или флешке, то он и есть эта директория. Только расширение у него не обязательно .000, но может быть и .001, .002 и т.д,

    Вот теперь думаю - стоит ли читать дальше?