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