ГОСТ-ключи в 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. В тестовом исходном наборе фигурируют:
Проверка наличия опции на установленном GPGSM:
Возможный тест экспорта из изолированного профиля (до завершения испытаний это не утверждение о рабочем результате):
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, а не «новая версия ГОСТ». Эти спецификации решают разные задачи.
См. сертификаты, администрирование и протокол.