Закрытый ключ КриптоПро CSP представляет из себя флеш-накопитель, на котором в директории ххххх.000 лежат файлы primary.key, primary2.key, masks.key, masks2.key, name.key и header.key.
![](https://habrastorage.org/getpro/habr/upload_files/95c/b28/fb4/95cb28fb4018e2384692bb3797f22ee6.png)
Такие ключи читаются только программой 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)
Evengard
21.08.2023 22:57pfx и p12 это на самом деле один и тот же формат. Другое дело, что bouncycastle поддерживает не все методы шифрования данных внутри него. Из-за этого и такие танцы с бубном...
Но я почти уверен что силами bouncycastle можно было бы создать сразу из исходных файлов нужный p12.
Evgenii_Liashov Автор
21.08.2023 22:57Да, все верно p12 и pfx одно и тоже, но проблема в том что после преобразования утилитой P12FromGostCSP контейнер почему-то не читается bouncycastle.
Помогает выгрузка ключа и сертификата из контейнера и помещение их в новый контейнер.
Pochemuk
21.08.2023 22:57Закрытый ключ КриптоПро CSP представляет из себя флеш-накопитель, на котором в директории ххххх.000 лежат файлы
Контейнер закрытого ключа - это не только флеш-накопитель. Кроме него это может быть крипто-токен, раздел реестра, просто директория на жестком диске.
Собственно говоря, если контейнер расположен на диске или флешке, то он и есть эта директория. Только расширение у него не обязательно .000, но может быть и .001, .002 и т.д,
Вот теперь думаю - стоит ли читать дальше?
Sap_ru
"Неизвлекаемые" можно сконвертировать ?
Так как если к этому добавить утилиту, которая перехватывает ключ из USB-накопителя (как мы помним RuToken.Lite это полнейшая профанация и неизвлекаемость там делается программно битом файле ключа)... то можно наконец копировать ключи, которые пишет дурацкая налоговая!
aborouhin
Да их и так можно копировать... общеизвестный способ, утилита tokens.exe правильной версии в помощь. Или я чего-то не понял?
itmind
Подскажите, как с токенов JaCarta скопировать?. Вариант с CertFix.exe не подходит
aborouhin
Я только вариант с копированием с Рутокен Лайт знаю. Если с JaCarta никак не получается, но очень надо - в принципе, можно в ФНС перевыпустить с записью на Рутокен...
itshnick88
Вы путаете понятия "неизвлекаемый" и "неэкспортируемый". В Rutoken Lite технически не может быть реализована неизвлекаемость, только флаг неэкспортируемости.
Sap_ru
Это не я путаю. Это RuToken брешет. Сам ключ не экспортируемый, ясен перец.