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

Ошибки OpenSSL ГОСТ: диагностика по симптомам

Диагностику начинайте с самого короткого сценария: убедитесь, что модуль загружается, алгоритм виден, создаётся новый тестовый ключ, а подпись проходит проверку. Затем переходите к сертификатам, PFX и прикладным протоколам.

Быстрый набор команд

openssl version -a
openssl version -e -m -d
openssl engine -t -c gost
openssl list -providers -verbose
openssl list -digest-algorithms | grep -Ei 'gost|streebog'
openssl list -cipher-algorithms | grep -Ei 'gost|magma|kuznyechik'
rpm -q openssl openssl-libs openssl-gost-engine
rpm -ql openssl-gost-engine

Ошибка unsupported algorithm

Причины: не загружен ГОСТ-профиль, приложение запущено с другой конфигурацией, используется только default Provider или алгоритм имеет другое имя. Проверьте OPENSSL_CONF, OPENSSL_MODULES, OPENSSL_ENGINES и список алгоритмов.

env | grep '^OPENSSL_' || true
openssl engine -vvvv gost
openssl list -public-key-algorithms | grep -i gost

Ошибка invalid curve / invalid paramset

Набор параметров должен соответствовать алгоритму. Для gost2012_256 используйте семейство TCA/TCB/TCC/TCD или согласованные имена; для gost2012_512 — A/B/C. Проверка:

openssl genpkey -algorithm gost2012_256 \
  -pkeyopt paramset:TCA -out /dev/null

Ошибка unable to load private key

Проверьте заголовок PEM, права, кодировку ASN.1, пароль и наличие нужного декодера:

head -n 1 private.pem
stat -c '%a %U:%G %n' private.pem
openssl pkey -in private.pem -check -noout

Не отправляйте полный вывод закрытого ключа в публичные журналы.

Подпись не проверяется

Сверьте исходные байты, открытый ключ и выбранный digest:

openssl pkey -in private.pem -pubout -outform DER > from-private.der
openssl pkey -pubin -in public.pem -outform DER > from-public.der
cmp from-private.der from-public.der
openssl dgst -md_gost12_256 -verify public.pem \
  -signature message.sig message.txt

Успешная проверка математической подписи не подменяет проверку доверия к сертификату.

Ошибка PFX unknown pbe algorithm

Проверяйте исходный OID и режим Engine/Provider. Для контейнера КриптоПро с OID 1.2.840.113549.1.12.1.80 используется Provider с default, legacy и gostprov. Подробнее — КриптоПро.

Ошибка PFX cipher has no object identifier

Это признак проблемы кодирования PBE/OID при экспорте современного PFX. Upstream для Provider описывает специальную интеграцию с libcrypto для RFC 9337/9548. Установите обновления OpenSSL/ГОСТ из НАЙС.ОС, проверьте профиль Engine и повторите тест на эталонном контейнере; не заменяйте алгоритм на неизвестный только ради исчезновения ошибки.

Ошибка сертификата certificate verify failed

openssl x509 -in certificate.crt -noout -subject -issuer -dates
openssl verify -CAfile root.crt certificate.crt
openssl x509 -in certificate.crt -noout -text \
  | grep -E 'DNS:|CA:|Key Usage|Signature Algorithm'

Проверьте SAN, назначение сертификата, часы, цепочку, отзыв и доверенный корень. Глобально отключать проверку сертификатов нельзя.

Ошибка в службе, а в интерактивной оболочке работает

Посмотрите окружение службы и пути модулей:

systemctl show myapp.service -p Environment
journalctl -u myapp.service -b --no-pager -n 100

Интерактивный Bash может использовать OPENSSL_CONF, которого нет у systemd-службы. Исправляйте профиль конкретной службы, а не права и параметры всех процессов.

Готовый минимальный тест

umask 077
mkdir -p "$HOME/gost-lab/selfcheck" && cd "$HOME/gost-lab/selfcheck"
printf 'selfcheck\n' > payload.txt
openssl genpkey -algorithm gost2012_256 -pkeyopt paramset:TCA -out key.pem
openssl pkey -in key.pem -pubout -out pub.pem
openssl dgst -md_gost12_256 -sign key.pem -out payload.sig payload.txt
openssl dgst -md_gost12_256 -verify pub.pem \
  -signature payload.sig payload.txt

Если этот тест проходит, но конкретное приложение не работает, изучайте его TLS-профиль, формат контейнера и конфигурацию среды запуска.