SCROLL
Среднее время на прочтение: 3 мин.

Как добавить поддержку шифрования по ГОСТ Р 34.10-2012 в OpenSSL 1.1.1d на Debian 9 Stretch

В работе имеется веб-сайт на котором реализована авторизация посредством ЕСИА (Единая система идентификации и аутентификации). До недавнего времени можно было использовать самоподписной RSA сертификат, но с 1 апреля 2020 года, для взаимодействия с ЕСИА необходимо использовать сертификат с алгоритмом шифрования по ГОСТ Р 34.10-2012.

 

В связи с этим мне необходимо было реализовать возможность работы с алгоритмом ГОСТ Р 34.11-2012 в OpenSSL на Debian 9 Stretch.

 

Путем перелопачивания множества информации по этому вопросу и проб использования движка GOST-Engine с различными версиями OpenSSL, для себя определил рабочую связку OpenSSL 1.1.1d + GOST-Engine.

 

В качестве памятки опишу действия для реализации связки OpenSSL 1.1.1d + GOST-Engine на Debian 9 Stretch.

 

Устанавливаем необходимые пакеты:

apt-get install build-essential wget git cmake unzip gcc -y

 

Выполняем сборку OpenSSL 1.1.1d, выполняем команды:

cd /opt

wget "https://github.com/openssl/openssl/archive/OpenSSL_1_1_1d.zip" -O "OpenSSL_1_1_1d.zip"
unzip OpenSSL_1_1_1d.zip && cd openssl-OpenSSL_1_1_1d

./config shared -d --prefix=/usr/ssl --openssldir=/usr/ssl
make all && make install

rm /usr/bin/openssl
ln -s /usr/ssl/bin/openssl /usr/bin/openssl
echo "/usr/ssl/lib" >> /etc/ld.so.conf.d/ssl.conf && ldconfig

 

Выполняем сборку GOST Engine, выполняем команды:

cd /opt

wget "https://github.com/gost-engine/engine/archive/58a46b289d6b8df06072fc9c0304f4b2d3f4b051.zip" -O gost-engine.zip
unzip gost-engine.zip -d ./ && cd engine-58a46b289d6b8df06072fc9c0304f4b2d3f4b051/

sed -i 's|printf("GOST engine already loaded\\n");|goto end;|' gost_eng.c
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release -DOPENSSL_ROOT_DIR=/usr/ssl -DOPENSSL_LIBRARIES=/usr/ssl/lib -DOPENSSL_ENGINES_DIR=/usr/ssl/lib/engines-3 ..
cmake --build . --config Release
cmake --build . --target install --config Release

 

Выполняем настройку OpenSSL для работы с GOST Engine. В файле конфигурации /usr/ssl/openssl.cnf добавляем следующие параметры (обращаем внимание на #комментарии):

# В начале файла
openssl_conf=openssl_def

# В конец файла
[openssl_def]
engines = engine_section

[engine_section]
gost = gost_section

[gost_section]
engine_id = gost
dynamic_path = /usr/ssl/lib/engines-3/gost.so
default_algorithms = ALL
CRYPT_PARAMS = id-Gost28147-89-CryptoPro-A-ParamSet

 

Для проверки готовности OpenSSL к работе с GOST Engine, выполним команды (подсвеченные):

openssl engine
(rdrand) Intel RDRAND engine
(dynamic) Dynamic engine loading support
(gost) Reference implementation of GOST engine
openssl ciphers|tr ':' '\n'|grep GOST
GOST2012-GOST8912-GOST8912
GOST2001-GOST89-GOST89

[stextbox id=’info’]ИНФОРМАЦИЯ. Если вывод такой же как у меня, то значит все собрано и настроено правильно.[/stextbox]

 

Для проверки сгенерируем сертификат по алгоритму GOST2012, для удобства просмотра переведем его в формат *.crt и скачиваем любым удобным способом на Windows машину:

openssl req -x509 -newkey gost2012_256 -pkeyopt paramset:A -nodes -keyout key.pem -out cert.pem
openssl x509 -outform der -in cert.pem -out cert.crt

 

В полученном сертификате смотрим алгоритм подписи, если он 1.2.643.7.1.1.3.2, то сертификат сгенерирован по ГОСТ Р 34.10-2012. Если на ПК установлен КриптоПро, то в Алгоритме подписи будет отображаться ГОСТ Р 34.11-2012/34.10-2012 256 бит.

 

ПОНРАВИЛАСЬ ИЛИ ОКАЗАЛАСЬ ПОЛЕЗНОЙ СТАТЬЯ, ПОДДЕРЖИ АВТОРА ДОНАТОМ

Обсуждение

6 комментариев
  • to Жаконда
    Спасибо!
    Не подскажете как в данный сертификат вставить аттрибуты
    req: Skipping unknown attribute «G»
    req: Skipping unknown attribute «1.2.643.100.4»
    ИНН-ЮЛ ?

  • у меня на debian 9 русские символы выводятся как «Кракозябры»
    На винде и на Линукс

  • Нет необходимости заниматься патчем!
    Новый (1.1.x) openssl поддерживает динамическую подгруздку модулей.
    Следовательно все команды необходимо выполнять с указанием engine и все будет работать:
    openssl -engine gost ciphers

    А чтобы не вываливалось сообщение о двойной подгруздке, не добавлять в конфиг ничего.

  • Спасибо, для Debian 10 установка аналогична, разве что пакеты поновее.
    1) OpenSSL достаточно использовать системный, не собирать свой.
    2) Из необходимых зависимостей — OpenSSL development files:
    sudo apt-get install libssl-dev
    3) gost-engine можно взять актуальную ветку для OpenSSL 1.1 (master переключился на 3.0)
    git clone https://github.com/gost-engine/engine.git gost-engine
    cd gost-engine
    git checkout openssl_1_1_0
    далее собираем по REAME