Pull to refresh

Преобразование закрытого ключа КриптоПро CSP по ГОСТ 2012 в контейнер p12, который понимает java

Level of difficultyMedium
Reading time2 min
Views7.7K

Закрытый ключ КриптоПро 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.

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

Tags:
Hubs:
Total votes 8: ↑4 and ↓4+5
Comments10

Articles