ГОСТ в OpenSSL
Начиная с версии 1.1.0.3.0.255.ge3af41d.p1-alt3 в пакете openssl-gost-engine доступен и корректно работает control-скрипт для включения и выключения поддержки ГОСТ. Для включения достаточно ввести (от суперпользователя) команду:
control openssl-gost enabled
В раннем релизе 1.1.0.3.0.255.ge3af41d.p1-alt2 была ошибка
Старый способ
Для этого создайте скрипт gost-for-openssl следующего содержания:
# Adapt OpenSSL for GOST cryptography support # See http://www.cryptocom.ru/products/openssl-1-config-en.html . shell-version . shell-ini-config shell_ini_config_prefix="" cfg="/etc/openssl/openssl.cnf" grep -q '^openssl_conf' $cfg || sed -i '1iopenssl_conf = openssl_def' $cfg subst 's/^default_md/#default_md/g' $cfg if [ $libshell_version -ge 3 ] ; then ini_config_set $cfg openssl_def engines engine_section ini_config_set $cfg engine_section gost gost_section ini_config_set $cfg gost_section engine_id gost ini_config_set $cfg gost_section default_algorithms ALL ini_config_set $cfg gost_section CRYPT_PARAMS id-Gost28147-89-CryptoPro-A-ParamSet else grep -q 'Gost' $cfg && exit cat >> $cfg [openssl_def] engines = engine_section [engine_section] gost = gost_section [gost_section] engine_id = gost default_algorithms = ALL CRYPT_PARAMS = id-Gost28147-89-CryptoPro-A-ParamSet _EOF_ fi
3. Проверьте, доступны ли шифры ГОСТ для OpenSSL:
$ openssl ciphers|tr ':' '\n'|grep GOST GOST2001-GOST89-GOST89 GOST94-GOST89-GOST89
Создание ключей
1. Создаём закрытый ключ с алгоритмом ГОСТ-2012 ( ca.key ):
$ openssl genpkey -algorithm gost2012_256 -pkeyopt paramset:TCB -out ca.key
2. Создаём сертификат на 365 дней ( ca.cer ):
$ openssl req -new -x509 -md_gost12_256 -days 365 -key ca.key -out ca.cer \ -subj "/C=RU/ST=Russia/L=Moscow/O=SuperPlat/OU=SuperPlat CA/CN=SuperPlat CA Root"
3. Проверка сертификата ( ca.cer ):
$ openssl x509 -in ca.cer -text -noout Certificate: Data: Version: 3 (0x2) Serial Number: 17:47:3b:c0:e1:9a:34:02:a6:b5:ea:5e:77:80:c1:c0:8a:6f:2e:a6 Signature Algorithm: GOST R 34.10-2012 with GOST R 34.11-2012 (256 bit) Issuer: C = RU, ST = Russia, L = Moscow, O = SuperPlat, OU = SuperPlat CA, CN = SuperPlat Root Validity Not Before: Apr 14 11:39:25 2020 GMT Not After : Apr 14 11:39:25 2021 GMT Subject: C = RU, ST = Russia, L = Moscow, O = SuperPlat, OU = SuperPlat CA, CN = SuperPlat Root Subject Public Key Info: Public Key Algorithm: GOST R 34.10-2012 with 256 bit modulus Public key: X:80FA69630DB1F99175D4659917082F1A85E49241C7CC3F406B25E42CCB53F875 Y:9AF4A5003B0E73055CEB6DC2D5B325EA16E7CE852CE5D8A479683EBAFC1F54D9 Parameter set: GOST R 34.10-2012 (256 bit) ParamSet B X509v3 extensions: X509v3 Subject Key Identifier: 63:29:DA:30:84:00:C3:7D:B5:F8:43:2F:A6:80:C7:A3:E1:B9:27:8C X509v3 Authority Key Identifier: keyid:63:29:DA:30:84:00:C3:7D:B5:F8:43:2F:A6:80:C7:A3:E1:B9:27:8C X509v3 Basic Constraints: CA:TRUE Signature Algorithm: GOST R 34.10-2012 with GOST R 34.11-2012 (256 bit) 71:73:29:32:b6:6e:9f:cc:22:30:5a:5b:60:4e:0d:41:5f:5d: 02:57:33:a8:0e:4f:b9:26:53:ce:9b:e7:25:12:ec:b6:c3:bf: fc:93:57:db:82:82:3d:fe:8c:ac:db:95:9e:45:ab:21:63:53: 4c:0c:ed:c0:b8:bd:da:f5:0f:7a
Используемая литература
Ссылки
Включение поддержки ГОСТ в OpenSSL на Ubuntu
Опубликовано: 04.03.2023
Поддержка ГОСТ в OpenSSL может нам понадобиться для создания сертификатов безопасности на основе российских алгоритмов шифрования. В данной инструкции мы рассмотрим настройку OpenSSL на Linux Ubuntu.
Подготовка системы
Для включения поддержки ГОСТ нам нужен пакет OpenSSL версии 1.1.1 и выше. Проверить текущую версию можно командой:
Мы должны увидеть что-то на подобие:
Если версия ниже, обновляем пакет. Для этого переходим к инструкции Как обновить OpenSSL на Linux.
Также нам нужно установить пакет, включающий библиотеки для поддержки алгоритмов шифрования ГОСТ:
apt install libengine-gost-openssl1.1
Мы готовы к настройке OpenSSL.
Настройка OpenSSL
После установки пакета libengine-gost-openssl в системе появляется файл gost.so. Его местоположение может быть разным, в зависимости от версий. Найдем данный файл командой:
В моем примере данный файл находился в корне системы. Это не очень правильно. Перенесем его в каталог, где должны находиться библиотеки в Ubuntu:
mv /gost.so /usr/lib/x86_64-linux-gnu/
Теперь откроем конфигурационный файл openssl:
* файл может содержать описание нескольких конфигураций. Директива openssl_conf указывает, какую конфигурацию должен использовать OpenSSL.
Убедитесь, что ниже нет другой директивы openssl_conf. В противном случае, будет использоваться не наша, а так, что ниже.
[openssl_def]
engines = engine_section
[engine_section]
gost = gost_section
[gost_section]
engine_id = gost
dynamic_path = /usr/lib/x86_64-linux-gnu/gost.so
default_algorithms = ALL
CRYPT_PARAMS = id-Gost28147-89-CryptoPro-A-ParamSet
* обратите внимание на опцию dynamic_path, в которой мы указываем полный путь до файла gost.so. Его мы переносили в каталог /usr/lib/x86_64-linux-gnu.
Проверим, что openssl поддерживает новые алгоритмы — для этого вводим команду:
openssl ciphers | tr ‘:’ ‘\n’ | grep GOST
Мы должны увидеть что-то на подобие:
LEGACY-GOST2012-GOST8912-GOST8912
IANA-GOST2012-GOST8912-GOST8912
GOST2001-GOST89-GOST89
Поддержка ГОСТ в OpenSSL добавлена.
Создание ГОСТ-сертификата
Создадим сертификат на основе алгоритма шифрования ГОСТ. Вводим такую команду:
openssl req -x509 -newkey gost2012_256 -pkeyopt paramset:A -nodes -keyout cert.key -out cert.pem
* это простая команда, которая сформирует открытый ключ cert.pem и закрытый cert.key с российским алгоритмом безопасности gost2012_256.
Система задаст несколько вопросов, после чего будут сформированы ключи.
Посмотрим на открытый ключ:
openssl x509 -text -in cert.pem
Мы увидим что-то на подобие:
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
04:51:9c:34:ba:d9:70:51:35:1f:9a:b6:a4:12:9a:0f:61:4d:2e:f2
Signature Algorithm: GOST R 34.10-2012 with GOST R 34.11-2012 (256 bit)
* Обратите внимание на Signature Algorithm.
ЭЦП по ГОСТ на GNU/Linux с помощью OpenSSL
Понадобилось как-то раз срочно подписать важный документ и отправить его контрагенту, который доверяет только бумаге с нотариально заверенной подписью или верифицированной ЭЦП. Попробуем же сэкономить время и деньги и по максимуму избежать платных проприетарных и аппаратных решений.
Удостоверяющий Центр выдал нам ключ и сертификат в одном PKCS#12 файле auth.p12
Я исхожу из того, что у нас в наличии есть linux и docker. Можно даже не локально — вполне можно закинуть наш документ куда-нибудь на хостинг и подключиться по SSH. Подробности установки docker и работы с докер-образами оставим за пределами этой заметки. Перейдём сразу к делу:
Прямо из папки, где лежит наш документ на подпись (document.pdf) и PKCS#12 файл (auth.p12) запускаем замечательный docker образ OpenSSL с поддержкой ГОСТ и заходим в контейнер:
sudo docker run —rm -i -t -v `pwd`:`pwd` -w `pwd` rnix/openssl-gost bash
Вытаскиваем из PKCS#12 файла приватный ключ и сохраняем его в pem-формате. Может потребоваться ввести ваш пароль от PKCS#12 файла.
openssl pkcs12 -in auth.p12 -out key.pem -engine gost -nodes -clcerts
Аналогично вытаскиваем из PKCS#12 файла и сертификат.
openssl pkcs12 -in auth.p12 -clcerts -nokeys -out pub.crt
Подписываем документ. Подпись будет отсоединенная, в формате PKCS#7 в отдельном файле (document.pdf.sig)
openssl smime -sign -signer pub.crt -inkey key.pem -engine gost -binary -noattr -outform DER -in document.pdf -out document.pdf.sig
Проверить подпись можно много где, как локально так и на сайте госуслуг, например.
Всё. Можно отправлять контрагенту документ и соответствующий sig файл.
Если вдруг у вас сертификат в формате DER (в Windows часто это файл с расширением .cer), то можно конвертировать такой сертификат в pem-формат:
openssl x509 -inform DER -in pub.cer -out pub.crt
Файлы в примерах команд выше:
auth.p12 — бинарный PFX-файл, содержащий сертификат и закрытый ключ
pub.crt — сертификат (содержащий открытый ключ) в текстовом формате PEM
pub.cer — сертификат (содержащий открытый ключ) в бинарном формате DER
key.pem — закрытый ключ
document.pdf — pdf-документ, который необходимо подписать
document.pdf.sig — файл куда будет сохранена отсоединённая подпись к документу