ГОСТ-ключи: создание, проверка, перенос и замена¶
В НАЙС.ОС закрытые и открытые ключи ГОСТ создаются стандартной утилитой 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 |
| Подпись не проходит | Открытый ключ, правильный алгоритм хэша, исходные байты файла |
Продолжение: параметры, подпись, форматы, защита ключей.