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

ГОСТ-ключи в PKCS#12/PFX: импорт, экспорт, защита и ограничения

Кому необходим PFX

PKCS#12 (обычные расширения .p12 и .pfx) — контейнер для совместного переноса сертификата и закрытого ключа, защищённого паролем. При правильной организации миграции позволяет перевести экспортируемую лабораторную ключевую пару из OpenSSL в GPGSM, а затем работать с сертификатом через интерфейс GnuPG. Контейнер является секретом высокой ценности. Не пересылайте его вместе с паролем и не выкладывайте в отчёты или публичный репозиторий.

Три разных случая, которые нельзя смешивать

Ситуация Как понимать
ГОСТ-ключ внутри P12, контейнер защищён AES/HMAC-SHA256 Уже проверено на niceos-gost; это не ГОСТ-профиль защиты PFX
Защита P12 алгоритмами magma/kuznyechik-ctr-acpkm и -omac, ГОСТ MAC, RFC 9337/9548 Предусмотрена патчем r12, нужны испытания на целевой сборке и внешнем приложении
P12, экспортированный КриптоПро CSP с его собственными параметрами Должен проверяться на настоящем файле КриптоПро; нельзя обещать универсальность заранее

Что дополнено в GnuPG r12

По патчу: расширенная обработка ГОСТ-2012/256 и /512 в PKCS#8, сохранение идентификаторов алгоритма и кривой при экспорте, поддержка legacy GOST28147 PBE и наборов HMAC, защита PBES2/ГОСТ согласно RFC 9337/9548, поддержка PBMAC1 по RFC 9879, обработка некоторых BER-представлений, ошибки вместо молчаливого импорта при нарушении MAC/OMAC/параметров и опция --p12-cipher при экспорте. Поддержка маскированных закрытых ключей в профиле RFC 9548 включена в структуру экспорта. Эти сведения основаны на добавленных участках sm/minip12.c, sm/gost-pfx.h, sm/gpgsm.c и тестах tests/gost/test-pfx-native.py.

Сама по себе защита PFX паролем не означает защиту ключа после импорта: его дальнейшую защиту обеспечивает gpg-agent и установленная политика паролей/файловых разрешений.

Уже проверенная процедура НАЙС.ОС

umask 077
LAB=/root/gost-cms-test/lab
cd "$LAB"

openssl genpkey -algorithm gost2012_256 -pkeyopt paramset:XA \
  -out niceos-lab.key.pem
chmod 600 niceos-lab.key.pem

openssl req -new -x509 -key niceos-lab.key.pem -days 30 \
  -subj '/C=RU/O=NiceOS Lab/CN=NiceOS GOST CMS Test' \
  -addext 'keyUsage=critical,keyAgreement,keyEncipherment' \
  -addext 'extendedKeyUsage=emailProtection' \
  -out niceos-lab.crt.pem

openssl pkcs12 -export \
  -inkey niceos-lab.key.pem -in niceos-lab.crt.pem \
  -keypbe AES-256-CBC -certpbe AES-256-CBC -macalg sha256 \
  -out niceos-lab.p12

mkdir -p "$LAB/gnupg"
chmod 700 "$LAB/gnupg"
gpgsm --homedir "$LAB/gnupg" --import niceos-lab.p12
gpgsm --homedir "$LAB/gnupg" --list-secret-keys

В зафиксированном запуске импортирован один закрытый ГОСТ-ключ, а --list-secret-keys выдал связанный сертификат. Проверка фактического использования ключа для расшифрования находится в разделе CMS.

Испытание специализированного ГОСТ-PFX

В r12 добавлена опция --p12-cipher NAME для выбора защиты экспортируемого PFX. В тестовом исходном наборе фигурируют:

magma-ctr-acpkm
magma-ctr-acpkm-omac
kuznyechik-ctr-acpkm
kuznyechik-ctr-acpkm-omac

Проверка наличия опции на установленном GPGSM:

gpgsm --dump-options | grep -E '^--p12-cipher$|p12-cipher'

Возможный тест экспорта из изолированного профиля (до завершения испытаний это не утверждение о рабочем результате):

LAB=/root/gost-cms-test/lab
FPR='ОТПЕЧАТОК_ЛАБОРАТОРНОГО_СЕРТИФИКАТА'

gpgsm --homedir "$LAB/gnupg" \
  --p12-cipher kuznyechik-ctr-acpkm-omac \
  --output "$LAB/niceos-gost-profile.p12" \
  --export-secret-key-p12 "$FPR"

Затем необходимо независимо открыть полученный PFX совместимой сборкой OpenSSL GOST Engine и проверить совпадение открытых ключей. Не выводите незашифрованный приватный ключ в терминал, журнал или общедоступную папку. Запускайте команду только в закрытом лабораторном каталоге.

Проверка повреждений и безопасность

В патче присутствуют отрицательные тесты: неправильный пароль, замена MAC, испорченная зашифрованная область, неверная соль, нулевая/чрезмерная итерация, неизвестный OID, неверный PRF, недопустимый UKM, плохой OMAC, ошибочная длина ключа, BER-представления. Критерий: никакой частичный закрытый ключ не появляется в хранилище, если MAC/OMAC неверны. Результаты тестов на стенде следует документировать отдельно.

Особенно важно: RFC 9548 — профиль PFX для ГОСТ; RFC 9879 — общий механизм PBMAC1 в PKCS#12, а не «новая версия ГОСТ». Эти спецификации решают разные задачи.

См. сертификаты, администрирование и протокол.