Перейти к содержанию

ГОСТ-ключи: создание, проверка, перенос и замена

В НАЙС.ОС закрытые и открытые ключи ГОСТ создаются стандартной утилитой openssl genpkey. Закрытый ключ используется для подписи и должен быть защищён, открытый ключ — для проверки подписи и выпуска сертификатов.

1. Подготовить безопасный каталог

umask 077
mkdir -p "$HOME/gost-lab/keys"
chmod 700 "$HOME/gost-lab" "$HOME/gost-lab/keys"
cd "$HOME/gost-lab/keys"
pwd

В терминале по умолчанию лучше не включать трассировку set -x: она может записать пароль или секретные параметры в журнал.

2. ГОСТ Р 34.10-2012 / 256

openssl genpkey \
  -algorithm gost2012_256 \
  -pkeyopt paramset:TCA \
  -out gost256-private.pem
chmod 600 gost256-private.pem

openssl pkey -in gost256-private.pem -pubout \
  -out gost256-public.pem

paramset:TCA — один из именованных наборов кривых. Для обмена с другой системой заранее согласуйте профиль и его OID; замена кривой может сделать ключ несовместимым с принимающей стороной.

3. ГОСТ Р 34.10-2012 / 512

openssl genpkey \
  -algorithm gost2012_512 \
  -pkeyopt paramset:A \
  -out gost512-private.pem
openssl pkey -in gost512-private.pem -pubout \
  -out gost512-public.pem

Нельзя получить ключ 512-битного профиля переименованием или перекодировкой ключа 256-битного профиля: создаётся новая пара.

4. ГОСТ Р 34.10-2001 для совместимости

openssl genpkey -algorithm gost2001 \
  -pkeyopt paramset:A -out legacy2001-private.pem
openssl pkey -in legacy2001-private.pem -pubout \
  -out legacy2001-public.pem

Для новых систем обычно выбирайте семейство ГОСТ 2012. Ключи старого семейства сохраняйте для совместимости с действующими документами, сертификатами и протоколами.

5. Проверить закрытый и открытый ключ

openssl pkey -in gost256-private.pem -check -noout
openssl pkey -pubin -in gost256-public.pem -pubcheck -noout
openssl pkey -pubin -in gost256-public.pem -text -noout
stat -c '%a %U:%G %n' gost256-private.pem

-text без -pubin может раскрыть приватные данные. Для инвентаризации храните вывод открытого ключа.

6. Убедиться, что открытый ключ действительно относится к закрытому

Получите открытую часть из закрытого ключа и сравните DER-представления:

openssl pkey -in gost256-private.pem -pubout -outform DER \
  > derived-public.der
openssl pkey -pubin -in gost256-public.pem -outform DER \
  > supplied-public.der
cmp derived-public.der supplied-public.der && echo 'Открытые ключи совпадают'

Проверка DER-байтов полезна после переноса между машинами и восстановления из резервной копии.

7. Преобразовать публичный ключ PEM ↔ DER

openssl pkey -pubin -in gost256-public.pem \
  -outform DER -out gost256-public.der
openssl pkey -pubin -inform DER \
  -in gost256-public.der -out restored-public.pem

PEM — текстовая оболочка Base64, DER — бинарное ASN.1-кодирование. Они не меняют криптографический алгоритм.

8. Создать файл параметров и ключ на его основе

openssl genpkey -genparam -algorithm gost2012_256 \
  -pkeyopt paramset:TCA -out gost256-params.pem
openssl genpkey -paramfile gost256-params.pem \
  -out gost256-from-params.pem

Файл параметров не является закрытым ключом. Команда с -paramfile создаёт новую пару ключей по выбранному набору.

9. Создать ключ и сразу проверить подпись

printf 'NiceOS GOST signing demo\n' > payload.txt
openssl dgst -md_gost12_256 -sign gost256-private.pem \
  -out payload.sig payload.txt
openssl dgst -md_gost12_256 -verify gost256-public.pem \
  -signature payload.sig payload.txt

Успешная проверка целого цикла полезнее одного факта существования PEM-файла.

10. Запасной экземпляр ключа и срок его действия

Сохраняйте закрытые ключи только в одобренном защищённом хранилище, с журналом доступа и процедурой восстановления. Для промышленных ключей используйте аппаратную защиту или утверждённый программный контейнер, если это требуется регламентом.

Для замены ключа создайте новую пару, выпустите новый сертификат, обновите принимающие стороны, затем выведите старую пару из эксплуатации. Не перезаписывайте единственную копию действующего закрытого ключа.

11. Частые причины ошибок

Сообщение Проверить
unsupported algorithm Загрузка ENGINE/Provider, OPENSSL_CONF, имя алгоритма
invalid curve / paramset Соответствие набора параметров выбранному профилю
unable to load key Формат PEM/DER, доступ к файлу, поддержка ASN.1-кодировки
Permission denied Владельца и режим 0600, каталог 0700
Подпись не проходит Открытый ключ, правильный алгоритм хэша, исходные байты файла

Продолжение: параметры, подпись, форматы, защита ключей.