Разработка приложений с ГОСТ через OpenSSL EVP¶
Приложения под НАЙС.ОС могут использовать российские криптографические алгоритмы через библиотеку OpenSSL. Предпочтительный путь — высокоуровневые интерфейсы EVP (EVP_PKEY, EVP_MD, EVP_CIPHER) вместо обращения к структурам алгоритма или ручной реализации криптографических примитивов.
Подготовить окружение для сборки¶
rpm -q openssl-devel openssl-gost-engine
pkg-config --modversion openssl
pkg-config --cflags --libs openssl
openssl list -digest-algorithms | grep -i gost
Псевдокод операции подписи¶
создать контекст EVP
загрузить закрытый ГОСТ-ключ
выбрать нужную хэш-функцию ГОСТ
EVP_DigestSignInit(...)
EVP_DigestSignUpdate(...)
EVP_DigestSignFinal(...) -> бинарная подпись
освободить контексты и очистить секретные буферы
Проверка выполняется тем же классом функций через EVP_DigestVerifyInit/Update/Final и открытый ключ.
Проверка обнаружения хэша в C¶
Пример использует OpenSSL Provider API и выводит, доступна ли реализация имени md_gost12_256:
#include <stdio.h>
#include <openssl/evp.h>
#include <openssl/provider.h>
int main(void) {
OSSL_PROVIDER *def = OSSL_PROVIDER_load(NULL, "default");
OSSL_PROVIDER *gost = OSSL_PROVIDER_load(NULL, "gostprov");
EVP_MD *md = EVP_MD_fetch(NULL, "md_gost12_256", NULL);
int available = md != NULL;
printf("GOST digest: %s\n", available ? "available" : "unavailable");
EVP_MD_free(md);
if (gost) OSSL_PROVIDER_unload(gost);
if (def) OSSL_PROVIDER_unload(def);
return available ? 0 : 1;
}
Компиляция:
cc -Wall -Wextra -O2 check-gost.c -o check-gost \
$(pkg-config --cflags --libs openssl)
./check-gost
Этот пример демонстрирует обнаружение алгоритма в Provider, не импортирует закрытые ключи. Для системного ENGINE-профиля алгоритмы доступны через другую цепочку регистрации EVP.
Конфигурация отдельного приложения¶
Чтобы не менять системные настройки, создайте профиль OPENSSL_CONF из раздела конфигурации и запустите приложение с этим окружением. При использовании systemd переменные задаются в файле unit/drop-in.
Практические рекомендации¶
- Не реализуйте ГОСТ вручную, если задача решается через EVP.
- Храните открытые ключи и сертификаты отдельно от закрытых ключей.
- Применяйте подходящий контейнер и формат ASN.1.
- Не передавайте закрытые ключи в логирование, трассировку и сообщения об ошибках.
- Тестируйте не только успешное шифрование/подпись, но и изменение данных, неправильный ключ, неверный пароль и повреждённый контейнер.
- При обновлении системных пакетов повторяйте регрессионные тесты.
Далее: контрольные примеры, Engine и Provider, исходники upstream.