Есть

1 Сертифиакт с контейнером закрытого ключа(header.key, masks.key, masks2.key, name.key, primary.key, primary2.key)

2. Он с поддержкой ГОСТ шифрования (2001 и 2012)

Чего хочется

хочу создать файл закрытого ключа (в формате RSA или PEM) и подписывать командами OPENSSL

Краткий план

  1. Нужно установить исходный сертификат (я использовала КриптоПРО)
  2. Выгружаем сертификат в формате pfx

Используем программу P12FromGostCSP, для получения контйнера PKCS#12

Дальше обновим openssl до версии > 1.1.1 и настроим на поддержку

  1. ГОСТ
  2. Теперь можем конвертировать, к примеру в pem

Настройка системы

важно!: для работы с GOST2012, версия openssl >=1.1.1

# источник (https://gist.github.com/shadz3rg/7badec13e154751116a6446fe9f61906)
# Ubuntu 18.04.1 LTS (GNU/Linux 4.15.0-36-generic x86_64)
# (из коробки) OpenSSL 1.1.0g  2 Nov 2017
# (из коробки) curl 7.58.0 (x86_64-pc-linux-gnu)
# PHP 7.2.10-0ubuntu0.18.04.1 (cli) (built: Sep 13 2018 13:45:02) ( NTS )

# Компилим GOST-engine
sudo apt install cmake libssl-dev
git clone --branch=openssl_1_1_0 https://github.com/gost-engine/engine.git gost-engine/engine
cd gost-engine/engine
cmake .
make

# узнаем нужную директорию, копируем туда
openssl version -e
cp bin/gost.so /usr/lib/x86_64-linux-gnu/engines-1.1

# конфиг
cp /etc/ssl/openssl.cnf /etc/ssl/openssl_custom.cnf
nano /etc/ssl/openssl_custom.cnf

# в начало файла
openssl_conf = openssl_def

# в конец
[openssl_def]
engines = engine_section

[engine_section]
gost = gost_section

[gost_section]
engine_id = gost
dynamic_path = /usr/lib/x86_64-linux-gnu/engines-1.1/gost.so
default_algorithms = ALL
CRYPT_PARAMS = id-Gost28147-89-CryptoPro-A-ParamSet

# включаем новый конфиг
export OPENSSL_CONF=/etc/ssl/openssl_custom.cnf

openssl s_client -connect service.rosminzdrav.ru:443
curl https://service.rosminzdrav.ru

Проверка поддержки ГОСТ

командой:

openssl engine

результат:

SUSE:/root # openssl engine (dynamic) Dynamic engine loading support
(gost) Reference implementation of GOST engine

посмотреть есть ли ГОСТ шифры

openssl ciphers|tr ':' '\n'|grep GOST

GOST2001-GOST89-GOST89
GOST94-GOST89-GOST89

Команды конвертации openssl

Результат работы утилиты P12FromGostCSP, должен содержать сертификат и закрытый ключ. Проверить это можно командой:

openssl.exe pkcs12 -in C:/key.pfx -nodes

Для преобразования контейнера в формат pem можно воспользоваться командой:

 openssl.exe pkcs12 -in C:/key.pfx -out C:/key.pem -nodes -clcerts

или

openssl pkcs12 -in path.p12 -out newfile.crt.pem -clcerts -nokeys
openssl pkcs12 -in path.p12 -out newfile.key.pem -nocerts -nodes

о командах openssl

Извление данных из контейнера

Извлечения Закрытого ключа из контейнера PFX:

openssl pkcs12 -in container.pfx -nocerts -out key2019.pem –nodes

или

openssl pkcs12 -nodes -in dev-with- cert.pfx -nocerts -out private.key

Извлечения файла сертификата из контейнера PFX:

openssl pkcs12 -in container.pfx -nokeys -out cert2019.pem

или

openssl pkcs12 -nokeys -in dev-with-priv.pfx -out cert.pem

Удаление парольной фразы из контейнера PFX:

openssl rsa -in key2017.pem -out serverkey2019.key

Просмотр содержимого private key:

openssl pkcs12 -in test_file.pfx -passin pass:{пароль} -nocerts -nodes

Сборка контейнера PFX:

openssl pkcs12 -export -out container.pfx -inkey serverkey2019.key -in cert2019.pem -certfile CA.crt

We can extract the private key form a PFX to a PEM file with this command:

openssl pkcs12 -in filename.pfx -nocerts -out key.pem

Exporting the certificate only:

openssl pkcs12 -in filename.pfx -clcerts -nokeys -out cert.pem

Removing the password from the extracted private key:

openssl rsa -in key.pem -out server.key

Ссылки