Введение
С 1 апреля 2020 года ЕСИА запрещает использование RSA-шифрования. В качестве замены предлагается ГОСТ Р 34.10-2012. Это требует получения ГОСТ-сертификата от аккредитованного удостоверяющего центра.
В большинстве такие сертификаты сгенерированы с помощью ПО КриптоПРО и открытие их с помощью любых других утилит (openssl, bouncycastle) не представляется возможным. Попытки открыть экспортированный из КриптоПРО PKCS#12 контейнер с помощью OpenSSL завершаются подобной ошибкой:
$ openssl pkcs12 -in container.pfx Enter Import Password: Bag Attributes localKeyID: 01 00 00 00 friendlyName: 20200313-114830-# ! (/) " &▒""-!" 2012 Microsoft CSP Name: Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider Error outputting keys and certificates 140403870810560:error:06074079:digital envelope routines:EVP_PBE_CipherInit:unknown pbe algorithm:../crypto/evp/evp_pbe.c:95:TYPE=1.2.840.113549.1.12.1.80 140403870810560:error:23077073:PKCS12 routines:PKCS12_pbe_crypt:pkcs12 algor cipherinit error:../crypto/pkcs12/p12_decr.c:41: 140403870810560:error:2306A075:PKCS12 routines:PKCS12_item_decrypt_d2i:pkcs12 pbe crypt error:../crypto/pkcs12/p12_decr.c:94:
Для решения этой проблемы потребуется дополнительное ПО, а также по отдельности экспортированные компоненты сертификата.
Настройка OpenSSL
В статье рассматривается OpenSSL 1.1.1 11 Sep 2018 и Ubuntu 18.04.
Для упрощения работы с ГОСТ шифрованием существует готовый Docker контейнер с OpenSSL + Gost engine.
Можно воспользоваться готовыми docker-образами с OpennSSL + Gost engine: https://hub.docker.com/r/rnix/openssl-gost/
Для начала нужно установить пакет с gost engine:
apt install libengine-gost-openssl1.1
После этого для включения поддержки требуется отредактировать файл конфигруации openssl: /etc/ssl/openssl.cnf:
В начало файла добавить:
openssl_conf = openssl_def
Затем добавить в конец:
[openssl_def] engines = engine_section [engine_section] gost = gost_section [gost_section] default_algorithms = ALL engine_id = gost CRYPT_PARAMS = id-Gost28147-89-CryptoPro-A-ParamSet
После этого можно проверить наличие ГОСТ-шифров командой:
openssl ciphers | tr ":" "\n" | grep -i gost
Если в выводе команды присутствует GOST2012, значит можно продолжать.
Конвертация экспортированных из КриптоПРО составляющих в PKCS#12 контейнер
Для выполнения этого пункта потребуется наличие всех составляющих, экспортированных из КриптоПРО:
header.key masks2.key masks.key name.key primary2.key primary.key
А также утилита https://github.com/kov-serg/get-cpcert. В статье не будет рассматриваться сборка утилиты. Уже готовые скомпилированные двоичные файлы можно найти в указанном репозитории на вкладке «releases».
Утилита позволяет сконвертировать составляющие сертфиката, понятные лишь КриптоПРО, в понятный OpenSSL, а значит и BouncyCastle, формат. Результат будет выведен в stdout, поэтому мы его сразу направим в файл.
Выполняем команду:
./get-cpcert <PATH> <PASSWORD> > result.pem
Где <PATH> — папка с файлами, экспортированными из КриптоПРО, а <PASSWORD> — пароль к ним. В результате выполнения команды будет получен файл result.pem, содержащий сертификат и приватный ключ.
Теперь можно создать PKCS#12 контейнер, который понимает Конструктор Порталов:
openssl pkcs12 -engine gost -export -in result.pem -out result.pfx
После этого result.pfx можно загружать в Конструктор Порталов. Поддержка ГОСТ в КП и Портале обеспечена в версиях 1.11 и 1.15+.