В работе имеется веб-сайт на котором реализована авторизация посредством ЕСИА (Единая система идентификации и аутентификации). До недавнего времени можно было использовать самоподписной 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
Для проверки сгенерируем сертификат по алгоритму 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 бит.
![]() |
![]() |
ПОНРАВИЛАСЬ ИЛИ ОКАЗАЛАСЬ ПОЛЕЗНОЙ СТАТЬЯ, ПОБЛАГОДАРИ АВТОРА
ПОНРАВИЛАСЬ ИЛИ ОКАЗАЛАСЬ ПОЛЕЗНОЙ СТАТЬЯ, ПОБЛАГОДАРИ АВТОРА
Спасибо, для 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
Нет необходимости заниматься патчем!
Новый (1.1.x) openssl поддерживает динамическую подгруздку модулей.
Следовательно все команды необходимо выполнять с указанием engine и все будет работать:
openssl -engine gost ciphers
А чтобы не вываливалось сообщение о двойной подгруздке, не добавлять в конфиг ничего.
у меня на debian 9 русские символы выводятся как «Кракозябры»
На винде и на Линукс
C ключом -utf8
Thank you
to Жаконда
Спасибо!
Не подскажете как в данный сертификат вставить аттрибуты
req: Skipping unknown attribute «G»
req: Skipping unknown attribute «1.2.643.100.4»
ИНН-ЮЛ ?